平衡二叉搜索樹(AVL)總結(超易懂)

在二叉搜索樹中,已經知道search、insert和remove等主要接口的運行時間均正比於樹的高度。但是在最壞的情況下,二叉搜索樹可能退化成列表,此時查找的效率會降至O(n)。因此,通常通過控制樹高,來控制最壞情況下的時間複雜度。

AVL樹腦圖
image

對於節點數目固定的BST,越是平衡,最壞情況下的查找速度越快,如下圖所示:
image
二叉搜索樹只有保持平衡時其查找效率纔會高。

AVL樹的特徵

  1. 左子樹與右子樹高度之差的絕對值不超過1
  2. 樹的每個左子樹和右子樹都是AVL樹
  3. 每一個節點都有一個平衡因子(balance factor),任一節點的平衡因子是-1、0、1(每一個節點的平衡因子 = 右子樹高度 - 左子樹高度)

當子樹的根結點的平衡因子爲+1時,它是左傾斜的(left-heavy)。

當子樹的根結點的平衡因子爲 -1時,它是右傾斜的(right-heavy)。

一顆子樹的根結點的平衡因子就代表該子樹的平衡性。

保持所有子樹幾乎都處於平衡狀態,AVL樹在總體上就能夠基本保持平衡。

AVL樹的基本查找、插入結點的操作和二叉樹的操作一樣。但是,當向AVL樹中插入一個結點後,還有一些額外的工作要做。首先,必須計算因插入操作對平衡因子帶來的改變。其次,如果任何平衡因子變成了+/-2,就必須從這個結點開始往下重新平衡這顆樹,這個重新平衡的過程就稱爲旋轉。

AVL樹的旋轉

旋轉操作用來重新平衡樹的某個部分。通過重新安排結點 ,使結點之間的關係始終保持左子結點小於父結點,父結點小於右子結點。使得該樹仍然是一顆二叉搜索樹。旋轉過後,旋轉子樹中的所有結點的平衡因子都爲+1、-1或0。

AVL樹的旋轉類型有4種, 分別是LL(left-left)旋轉、LR(left-right)旋轉、RR(right-right)旋轉和RL(right-left)旋轉。

爲方便理解在何時執行哪一種旋轉,設x代表剛插入AVL樹中的結點,設A爲離x最近且平衡因子更改爲2的絕對值的祖先。

LL旋轉

如下圖所示,當x位於A的左子樹的左子樹上時,執行LL旋轉

設left爲A的左子樹,要執行LL旋轉,將A的左指針指向left的右子結點,left的右指針指向A,將原來指向A的指針指向left。

旋轉過後,將A和left的平衡因子都改爲0。所有其他結點的平衡因子沒有發生變化。
image

LR旋轉

當x位於A的左子樹的右子樹上時,執行LR旋轉。

設left是A的左子結點,並設A的子孫結點grandchild爲left的右子結點。

要執行LR旋轉,將left的右子結點指向grandchild的左子結點,grandchild的左子結點指向left,A的左子結點指向grandchild的右子結點,再將grandchild的右子結點指向A,最後將原來指向A的指針指向grandchild。

執行LR旋轉之後,調整結點的平衡因子取決於旋轉前grandchild結點的原平衡因子值。

如果grandchild結點的原始平衡因子爲+1,就將A的平衡因子設爲-1,將left的平衡因子設爲0。

如果grandchild結點的原始平衡因子爲0,就將A和left的平衡因子都設置爲0。

如果grandchild結點的原始平衡因子爲-1,就將A的平衡因子設置爲0,將left的平衡因子設置爲+1。

在所有的情況下,grandchild的新平衡因子都是0。所有其他結點的平衡因子都沒有改變。
image

RR旋轉

當x位於A的右子樹的右子樹上時,執行RR旋轉

RR旋轉與LL旋轉是對稱的關係。

設A的右子結點爲Right。要執行RR旋轉,將A的右指針指向right的左子結點,right的左指針指向A,原來指向A的指針修改爲指向right。

完成旋轉以後,將A和left的平衡因子都修改爲0。所有其他結點的平衡因子都沒有改變。

image

RL旋轉

當x位於A的右子樹的左子樹上時,執行RL旋轉

RL旋轉與LR旋轉是對稱的關係。

設A的右子結點爲right,right的左子結點爲grandchild。要執行RL旋轉,將right結點的左子結點指向grandchild的右子結點,將grandchild的右子結點指向right,將A的右子結點指向grandchild的左子結點,將grandchild的左子結點指向A,最後將原來指向A的指針指向grandchild。

執行RL旋轉以後,調整結點的平衡因子取決於旋轉前grandchild結點的原平衡因子。這裏也有三種情況需要考慮:

如果grandchild的原始平衡因子值爲+1,將A的平衡因子更新爲0,right的更新爲-1;

如果grandchild的原始平衡因子值爲 0,將A和right的平衡因子都更新爲0;

如果grandchild的原始平衡因子值爲-1,將A的平衡因子更新爲+1,right的更新爲0;

在所有情況中,都將grandchild的新平衡因子設置爲0。所有其他結點的平衡因子不發生改變。
image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章