平衡二叉樹 AVL

2021-06-21 20:36:08 字數 1542 閱讀 8024

平衡二叉樹在查詢中經常用到。由於平衡二叉樹是一種平衡的二叉排序樹,所以其建立方法必須要遵守二叉排序樹的規則,即每個新插入的節點是乙個葉子節點。它左右子樹高度差不超過1,並且要求左右子樹也是平衡二叉樹,並且左子樹的節點最大值小於根節點,右子樹節點最小值大於根節點。

(1)高度為log n ;

(2)平均查詢長度為log n 

給定乙個陣列 a = ,以此為例構建平衡二叉樹。在節點上定義乙個定義乙個平衡因子來標記該節點的平衡狀態,它的值是該節點的左子樹深度減去右子樹深度。

(1)插入13:

(2)插入24:

(3)插入37,插入之後,出現不平衡現象,需要做出調整。由於根節點的平衡因子為-2,所以需要將根節點左旋。調整之後,根節點平衡因子為0,達到二叉樹平衡狀態:

(4)插入90:

(5)插入53,插入之後,由於樹中有節點的平衡因子絕對值大於1,所以需要調整。自底向上,由於90的平衡因子為1,將向右旋轉。自底向上,對此時平衡因子為-2的節點進行調整,左旋。

此時根節點平衡因子為-1,二叉樹達到平衡。

(1)若t為空,則將e作為根節點,t的深度加1 ;

(2)若e與根節點value相等,則不進行插入 ;

(3)若e小於根節點value,且在根節點的左子樹中不存在value和e相等的節點,則將e插入到左子樹上,並且左子樹深度加1,判斷是否要進行調整,分為以下三種情況:

a. 插入之前根節點平衡因子為-1,則將根節點平衡因子改為0,t深度不變 ;

b. 插入之前根節點平衡因子為0,則將根節點平衡因子改為1,t的深度加1 ;

c. 插入之前根節點平衡因子為1,此時需要進行調整:若根節點左孩子的平衡因子為1,則對根節點進行右旋。將右旋之後的根節點和右孩子的平衡度改為0,樹深度不變。

(4)若e大於根節點value,並且在右子樹中不存在value和e相等的節點,則將e插入到右子樹上,右子樹的深度加1,且要分情況對t進行調整,具體的討論跟(3)類似。

1、資料結構(c語言版) 嚴蔚敏、吳偉民

2、演算法導論

平衡二叉樹(AVL樹)

左右子樹高度之差的絕對值不超過1,左右子樹高度之差稱為該結點的平衡因子。通過對樹的結構進行調整,使樹的高度在每次插入結束後仍能保持o logn 的級別。引入變數height來記錄高度struct node 新建乙個結點 1.申請變數空間 2 初始結點權值,高度 1 3 初始左右孩子為空 4 返回新建...

平衡二叉樹 AVL 實現(3)

現象1 注意 q是30,而不是20,因為刪除了25,節點會移動,以下現象均遵循此規律 現象2 現象3 現象1和現象2比較簡單,不需要平衡化處理,現象3則比較複雜.先討論現象1和2 先找到節點,然後刪除節點 private node findnode int value if value node.d...

平衡二叉樹 AVL 實現 2

繼續討論旋轉 為了方便討論是做點記號 x為插入的節點p為旋轉軸 p有時候為x的父節點如ll,rr旋轉 p有時候也為x,如lr,rl旋轉 r為平衡因子絕對值 2的節點 看下面四種情況 當三個節點處於一條直線,並均是左節點時,需要以中間的節點為旋轉軸向右側 順時針 旋轉一次 使得c成為b的右子節點 b代...