平衡二叉樹(AVL)樹

一、平衡二叉樹定義spa

是一種二叉排序樹(二叉查找樹、二叉搜索樹),其中每一個節點的左子樹和右子樹的高度差不大於1。(左右子樹也是平衡二叉樹)指針

平衡因子BF = 二叉樹節點的左子樹深度減去右子樹深度 = 節點的平衡因子(BF)排序

最小不平衡子樹:距離插入節點最近的,且平衡因子的絕對值大於1的節點爲根的子樹。效率

爲了提升查找效率,把二叉排序樹構形成平衡二叉樹。平衡二叉樹的查找、插入和刪除的時間複雜度都是O(logn),最壞狀況下,二叉排序樹的查找時間複雜度是O(n)即很是不平衡的斜樹。因此要構造平衡二叉樹提升查找效率。二叉樹

 

 

2、平衡二叉樹的構建方法:搜索

若向平衡二叉樹中插入一個新結點後破壞了平衡二叉樹的平衡性。首先要找出插入新結點後失去平衡的最小子樹根結點的指針。而後再調整這個子樹中有關結點之間的連接關係,使之成爲新的平衡子樹。當失去平衡的最小子樹被調整爲平衡子樹後,原有其餘全部不平衡子樹無需調整,整個二叉排序樹就又成爲一棵平衡二叉樹。方法

失去平衡的最小子樹是指以離插入結點最近,且平衡因子絕對值大於 1 的結點做爲根的子樹。假設用 A 表示失去平衡的最小子樹的根結點,則調整該子樹的操做可概括爲下列四種狀況。im

1  RR 型平衡旋轉法(右旋)img

因爲在 A 的左孩子 B 的左子樹上插入結點 F ,使 A 的平衡因子由 1 增至 2 而失去平衡。故需進行一次順時針旋轉操做。 即將 A 的左孩子 B 向右上旋轉代替 A 做爲根結點, A 向右下旋轉成爲 B 的右子樹的根結點。而原來 B 的右子樹則變成 A 的左子樹。時間

 

2  LL 型平衡旋轉法(左旋)

因爲在 A 的右孩子 C  的右子樹上插入結點 F ,使 A 的平衡因子由 -1 減至 -2 而失去平衡。故需進行一次逆時針旋轉操做。即將 A 的右孩子 C 向左上旋轉代替 A 做爲根結點, A 向左下旋轉成爲 C 的左子樹的根結點。而原來 C 的左子樹則變成 A 的右子樹。

 

3 LR 型平衡旋轉法(左右)

因爲在 A 的左孩子 B 的右子數上插入結點 F ,使 A 的平衡因子由 1 增至 2 而失去平衡。故需進行兩次旋轉操做(先逆時針,後順時針)。即先將 A 結點的左孩子 B 的右子樹的根結點 D 向左上旋轉提高到 B 結點的位置,而後再把該 D 結點向右上旋轉提高到 A 結點的位置。即先使之成爲 LL 型,再按 LL 型處理

 

如圖中所示,即先將圓圈部分先調整爲平衡樹,而後將其以根結點接到 A 的左子樹上,此時成爲 LL 型,再按 LL 型處理成平衡型。

4 RL 型平衡旋轉法(右左)

因爲在 A 的右孩子 C 的左子樹上插入結點 F ,使 A 的平衡因子由 -1 減至 -2 而失去平衡。故需進行兩次旋轉操做(先順時針,後逆時針),即先將 A 結點的右孩子 C 的左子樹的根結點 D 向右上旋轉提高到 C 結點的位置,而後再把該 D 結點向左上旋轉提高到 A 結點的位置。即先使之成爲 RR 型,再按 RR 型處理。

 

如圖中所示,即先將圓圈部分先調整爲平衡樹,而後將其以根結點接到 A 的左子樹上,此時成爲 RR 型,再按 RR 型處理成平衡型。

平衡化靠的是旋轉。 參與旋轉的是 3 個節點(其中一個多是外部節點 NULL ),旋轉就是把這 3 個節點轉個位置。注意的是,左旋的時候 p->right 必定不爲空,右旋的時候 p->left 必定不爲空,這是顯而易見的。

若是從空樹開始創建,並時刻保持平衡,那麼不平衡只會發生在插入刪除操做上,而不平衡的標誌就是出現 bf == 2 或者  bf == -2 的節點。

相關文章
相關標籤/搜索