1. 程式人生 > 程式設計 >資料結構 平衡二叉樹 (AVL Tree)

資料結構 平衡二叉樹 (AVL Tree)

定義

平衡二叉樹(AVL樹)在符合二叉查詢樹的條件下,還滿足任何節點的兩個子樹的高度最大差為1。

如圖,左圖兩邊高度差沒超過1,屬於平衡二叉樹(AVL樹),右圖兩邊高度差超過1,屬於非平衡二叉樹

平衡二叉樹的失衡

如果在AVL樹中進行插入或刪除節點,可能導致AVL樹失去平衡。

從上面可以看出,失衡原因是左右子樹高度差到達了2

四種失衡情況

二叉樹的失衡分為四種情況

LL(左左)失衡

左樹的左側比右樹高了兩層,因此是 左樹的左側 導致的失衡,所以叫左左

LR(左右)失衡

左樹的右側 導致的失衡

RL(右左)失衡

右樹的左側 導致的失衡

RR(右右)失衡

右樹的右側 導致的失衡

失衡調整

失衡之後,需要將AVL Tree調整為平衡狀態,不同的失衡情況調整方法也不一樣

LL(左左)失衡調整

如下圖 將LL(左左)失衡的樹型結構想象成用線連結的小球

  1. 用手將左樹的頭節點的小球提起來,一直提到比原始頭節點還高的位置。此時,原始頭節點"掉了下來",左樹頭節點成為新的頭節點。
  2. 新的頭節點有三個子節點,其中中間的那個節點是原來左樹的右節點,把它的線解開,然後把它掛載到原始頭節點的左側
  3. 經過這兩個步驟,LL(左左)失衡的AVL Tree調整平衡

失衡調整核心步驟總結:

  1. “提起”失衡子樹,直到原始頭節點“落下”,失衡子樹的頭節點成為新的頭節點
  2. 將新頭節點的中間節點(原始子樹右節點),掛載到原始頭節點的左側

RR(右右)失衡調整

RR(右右)失衡調整 跟 LL(左左)失衡調整是同一個套路,我就不畫那麼詳細了

如圖,兩種RR(右右)失衡調整

LR(左右)失衡調整

RL(右左)失衡調整

與 LR(左右)失衡調整相同的套路,也是斷開連結後調整一次,建立連結後在調整一次,我就不畫了,感興趣的同學可以動手畫一下