1、基本概念 算法
從查找時間上來考慮,高度爲n的二叉查找樹(Binary Search Tree),在最壞的狀況下查找時間爲O(n)。而最好的狀況下查找時間是O(logn),所以咱們指望二叉樹永遠處於最好的狀況。spa
基於這個指望,1962年阿德爾森-維爾斯和蘭迪斯(Adelson-Velskii and Landis)提出了一種節點在高度上相對平衡的二叉查找樹,它的平均和最壞狀況下的查找時間都是O(logn),同時插入和刪除的時間複雜性也會保持O(logn),且在插入或刪除以後,高度上仍然保持平衡。這種樹稱爲平衡二叉樹(Balanced Binary Tree)。因爲提出者的緣由,平衡二叉樹也被稱爲AVL樹。3d
2、平衡二叉樹的特色 指針
平衡二叉樹是一個高級的二叉排序樹(Binary Search Tree),除二叉排序樹的特色外:blog
(1)左右子樹深度差的絕對值不超過1;排序
(2)左右子樹也是平衡二叉樹。二叉樹
平衡因子:BF = 左子樹的深度 - 右子樹的深度。im
平衡因子的取值只能是一、0、-1。若其絕對值大於,則失去平衡性。margin
3、算法思想
img
若一顆平衡二叉樹被插入一個新的節點後失去了平衡性。首先要找出失去平衡的最小子樹的根節點的指針。而後調整這顆子樹中節點之間的位置關係,使其恢復平衡性。
失去平衡的最小子樹是指離插入節點最近且平衡因子絕對值大於1的根節點所在的最小子樹。
若A爲失去平衡性的最小子樹的根節點,則恢復平衡性的辦法可概括爲如下四種:
(1)LL(左孩子的左子樹)型平衡旋轉法
插入前:A的左子樹B和右子樹E的深度分別爲1和0,所以A的平衡因子是1,處於平衡狀態,
同理,其B子樹和E子樹也是處於平衡狀態的。
插入後:A的左子樹B和右子樹的深度分別爲2和0,所以A的平衡因子是2,處於非平衡狀態。
而B子樹和E子樹此時是處於平衡狀態的。
通過以上三個步驟,插入F後的平衡二叉樹又恢復了平衡狀態,具體過程由下圖所示: