在講到集合的時候,很容易讓人想到的是數組和鏈表。而後你們會討論這兩種數據結構的差別。可是根據指定的內容在集合中查找,這兩種數據結構的性能卻沒有區別都是O(n),如何提升在集合中檢索指定內容數據的性能,是咱們在程序開發中面臨的問題。算法
經過二叉排序樹及相關操做說明咱們能夠總結二叉排序樹的形狀是由根節點的值決定的,若是在極端狀況下,根節點的值取的足夠小,容易退化成鏈表,致使查詢時間複雜度升高,查詢性能降低。
所以在二叉排序樹的基礎上具備如下性質的二叉排序樹稱爲二叉平衡樹:
segmentfault
AVL樹最明顯的特色是根據其特性能進行旋轉,可是在描述旋轉的時候,一些術語比較晦澀難懂,因此對一些術語進行了圖形描述
數組
樹中結點的最大層次結點爲樹的深度數據結構
Balance Factory=> BF定義爲該結點的左子樹的深度減去該結點的右子樹的深度,則平衡二叉樹上全部結點的平衡因子只多是-一、0、1。只要二叉樹上的一個節點的平衡因子的絕對值大於1,則該二叉樹就是不平衡的。性能
AVL樹的插入操做和刪除操做都有可能形成AVL二叉樹失去其原有的特性,爲此須要進行旋轉操做使AVL樹再平衡
說明:爲了對比平衡二叉樹旋轉先後的變化,我沒有作節點名稱的變化spa
在平衡二叉樹的根節點的左子樹的根節點的左子樹上插入一個節點致使二叉樹失去平衡,進行的單向右旋平衡處理,操做如圖所示:
排序
在平衡二叉樹的根節點的右子樹的根節點的右子樹上插入一個節點致使平衡二叉樹失去平衡,進行的單向左旋平衡處理,操做如圖所示:
圖片
在平衡二叉樹的根節點的左子樹的根節點的右子樹上插入一個節點致使平衡二叉樹失去平衡,進行的雙向旋轉處理,操做如圖所示:
開發
在平衡的二叉樹的根節點的右子樹的根節點的左子樹上插入一個節點致使平衡二叉樹失去平衡,進行的雙向旋轉處理,操做如圖所示:
get
在平衡的二叉排序樹BBST(Balance Binary Sorted Tree)上插入一個新的數據元素e,平衡算法可描述以下:
若數據元素e的關鍵字小於BBST樹的根節點的關鍵字,並且在BBST的左子樹中不存在和數據元素e的關鍵字相同的關鍵字,則將e插入BBST的左子樹上,若插入新元素以後的左子樹的深度增長(+1)時,須要分狀況討論: