數據結構-平衡二叉樹

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子樹此時是處於平衡狀態的。

  • 分析:因爲在A的左孩子B的左子樹上插入F節點,使A失去了平衡性,所以採用LL型旋轉法(一次順時針旋轉操做)。
  • 旋轉:將B節點向右上順時針旋轉,代替A做爲根節點,A向右下旋轉成爲B的右子樹的根節點。
  • 調整:因爲旋轉後的B節點此時擁有三顆子樹,所以它不符合平衡二叉樹的性質,須要繼續調整。因爲B<D<A,將D調整做爲A的左子樹。

通過以上三個步驟,插入F後的平衡二叉樹又恢復了平衡狀態,具體過程由下圖所示:

 

 

相關文章
相關標籤/搜索