平衡二叉樹——AVL

AVL

以前寫過的二叉排序樹(BST)在插入、刪除和查找等基本操做的平均時間爲O(logN),但在最壞的狀況下,這些基本運算的時間均會增至O(n)(由於退化成了鏈表)。爲了不這些狀況發生,人們研究了許多種動態平衡的方法,使得在樹中插入或刪除元素時,經過調整樹的形態來保持樹的「平衡」,使之既保持BST的性質不變又保證樹的高度在任何狀況下均爲O(logN),從而確保樹上的基本運算在最壞狀況下的時間也均爲O(logN)。下面的AVL就是這樣的平衡樹。node

AVL 樹是一種平衡二叉樹,得名於其發明者的名字( Adelson-Velskii 以及 Landis)。平衡二叉樹遞歸定義以下:算法

  1. 左右子樹的高度差小於等於 1。
  2. 其每個子樹均爲平衡二叉樹。

基於兩點,咱們就能夠進行判斷其一棵樹是否爲平衡二叉樹了。spa

一個AVL樹的例子

AVL-Tree1.jpg

一個不是AVL樹的例子

Not-AVL1.jpg
由於節點8的子樹之差大於爲2code

實現原理

算法經過平衡因子(balaced factor,用bf表示)來具體實現上述平衡二叉樹的定義。平衡因子的定義:平衡二叉樹中每一個節點有一個平衡因子,每一個節點的平衡因子是該節點的左子樹高度減去右子樹的高度。從平衡因子的角度說,若一棵二叉樹中全部節點的平衡因子的絕對值都小於等於1,即平衡因子取值爲0、1或-1,則該二叉樹爲平衡二叉樹。
用C語言定義該節點爲:blog

typedef struct node
{
    KeyType key;
    int bf;   // 平衡因子
    InfoType data;
    struct node *lchild, *rchild;    
} BSTNode;

插入調整

若向平衡二叉樹插入一個新節點後破壞了平衡二叉樹的平衡性,首先從該新插入節點向根節點方向找到第一個失去平衡的節點,而後以該失衡節點和它相鄰的剛查找過的兩個節點構成調整子樹,使之成爲新的平衡子樹。
失去平衡的最小子樹是指以離插入節點最近,且平衡因子絕對值大於1的節點做爲根節點的子樹。調整該子樹有如下四種情形:排序

(1) LL型調整
圖片描述遞歸

(2) RR型調整
圖片描述圖片

(3) LR型調整
圖片描述it

(4) RL型調整
圖片描述class

相關文章
相關標籤/搜索