資料結構 平衡二叉樹 (AVL Tree)
阿新 • • 發佈:2019-12-31
定義
平衡二叉樹(AVL樹)在符合二叉查詢樹的條件下,還滿足任何節點的兩個子樹的高度最大差為1。
如圖,左圖兩邊高度差沒超過1,屬於平衡二叉樹(AVL樹),右圖兩邊高度差超過1,屬於非平衡二叉樹
平衡二叉樹的失衡
如果在AVL樹中進行插入或刪除節點,可能導致AVL樹失去平衡。
從上面可以看出,失衡原因是左右子樹高度差到達了2
四種失衡情況
二叉樹的失衡分為四種情況
LL(左左)失衡
左樹的左側比右樹高了兩層,因此是 左樹的左側 導致的失衡,所以叫左左
LR(左右)失衡
左樹的右側 導致的失衡
RL(右左)失衡
右樹的左側 導致的失衡
RR(右右)失衡
右樹的右側 導致的失衡
失衡調整
失衡之後,需要將AVL Tree調整為平衡狀態,不同的失衡情況調整方法也不一樣
LL(左左)失衡調整
如下圖 將LL(左左)失衡的樹型結構想象成用線連結的小球
- 用手將左樹的頭節點的小球提起來,一直提到比原始頭節點還高的位置。此時,原始頭節點"掉了下來",左樹頭節點成為新的頭節點。
- 新的頭節點有三個子節點,其中中間的那個節點是原來左樹的右節點,把它的線解開,然後把它掛載到原始頭節點的左側
- 經過這兩個步驟,LL(左左)失衡的AVL Tree調整平衡
失衡調整核心步驟總結:
- “提起”失衡子樹,直到原始頭節點“落下”,失衡子樹的頭節點成為新的頭節點
- 將新頭節點的中間節點(原始子樹右節點),掛載到原始頭節點的左側
RR(右右)失衡調整
RR(右右)失衡調整 跟 LL(左左)失衡調整是同一個套路,我就不畫那麼詳細了
如圖,兩種RR(右右)失衡調整
LR(左右)失衡調整
RL(右左)失衡調整
與 LR(左右)失衡調整相同的套路,也是斷開連結後調整一次,建立連結後在調整一次,我就不畫了,感興趣的同學可以動手畫一下