以前寫過的二叉排序樹(BST)在插入、刪除和查找等基本操做的平均時間爲O(logN),但在最壞的狀況下,這些基本運算的時間均會增至O(n)(由於退化成了鏈表)。爲了不這些狀況發生,人們研究了許多種動態平衡的方法,使得在樹中插入或刪除元素時,經過調整樹的形態來保持樹的「平衡」,使之既保持BST的性質不變又保證樹的高度在任何狀況下均爲O(logN),從而確保樹上的基本運算在最壞狀況下的時間也均爲O(logN)。下面的AVL就是這樣的平衡樹。node
AVL 樹是一種平衡二叉樹,得名於其發明者的名字( Adelson-Velskii 以及 Landis)。平衡二叉樹遞歸定義以下:算法
基於兩點,咱們就能夠進行判斷其一棵樹是否爲平衡二叉樹了。spa
由於節點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