Transcript AVL

高度平衡二元搜尋樹
學號:96363034
姓名:胡容豪
何謂高度平衡二元搜尋樹
2
1.
1962年,兩位蘇聯數學家,G.M.AdelsonVelskii與E.M.Landis建立這個平衡的二元樹結
構。
2.
樹的取名,就是依據他們的名字─AVL樹。
3.
AVL樹就是子樹的高度差不超過1的搜尋樹。
兩棵二元搜尋樹
3
建立下列數字之二元搜尋樹
1.


依序 8,12,14,18,20,23,44,52
依序 23,18,12,8,14,20,44,52
兩棵二元搜尋樹
4
依序 8,12,14,18,20,23,44,52
依序 23,18,12,8,14,20,44,52
(b )
(a ) 一 個 不 平 衡 的
BST
一 個
AVL 樹
何謂高度平衡二元搜尋樹
5
一棵空樹(empty tree)是高度平二元搜尋樹。
假使T不是空的二元搜尋樹,TL和TR分別是此二
元搜尋樹的左子樹和右子樹,若符合下列兩個
條件,則稱T為高度平衡二元搜尋樹:(1)TL和TR
亦是高度平衡二元搜尋樹。
(2)|hL-hR| ≤ 1,其中hL及hR分別是TL和TR的高度。
何謂高度平衡二元搜尋樹
6
在一棵二元搜尋樹中有一節點p,其左子樹 (TL)
和右子樹 (TR) 的高度分別是hL和hR,而BF(p)表
示p節點的平衡因子(balanced factor)。平衡
因子之計算為hL-hR。在一棵AVL-tree裡,每一
節點的平衡因子為-1或零或1,即 |BF(p) | ≤
1。
一棵AVL樹
7
( a ) 子 樹 2 3 是 平 衡 的 :H L - H R = 1
( c ) 子 樹 4 4 是 平 衡 的 :| H L - H R |= 1
( b ) 子 樹 1 8 是 平 衡 的 : H L-H A = 1
AVL-tree的加入
8
1.
2.
高度平衡二元搜尋樹可能會因為加入或刪除某節
點而形成不平衡狀態,此時須視不平衡狀態是那
一類型,之後,再加以調整之。
通常不平衡的狀態可分為LL、RR、LR與RL四大類
型。
AVL-tree的加入
9
利用加入的節點A與它最接近平衡因子絕對值大於
1(|BF|>1)的節點B:
1.
2.
3.
4.
若A在B節點的左邊的左邊,則為LL型。
若A在B節點的右邊的右邊,則為RR型。
若A在B節點的左邊的右邊,則為LR型。
若A在B節點的右邊的左邊,則為RL型。
AVL 樹的不平衡點調整之四種型式
10
(1)LL型
(2)RR型
(3)LR型
(4)RL型
AVL 樹之平衡調整步驟
11
1.
2.
3.
4.
找出關鍵路徑,計算路徑上每一節點的平衡因
子。
從樹根開始,找到最後一個平衡因子大於1以上
的節點,稱為關鍵節點。
決定調整種類(LL、RR、RL、LR)。
進行調整,必須保持二元搜尋樹的定義。
AVL-tree的加入
12
一、 LL型(左邊的左邊)
加入前的AVL-tree如下:
AVL-tree的加入
13
加入30後的AVL-tree如下:每個節點的上面數字
表示平衡因子。
AVL-tree的加入
14
此時50節點的|BF|>1,因此不為一棵AVL-tree,
其調整的方法乃將40往上提,50放在40的右
方,如下圖所示:
AVL-tree的加入
15
二、 RR型(右邊的右邊)
此RR型與LL型大同小異,如加入前的AVL-tree
為:
AVL-tree的加入
16
加入70後的AVL-tree為:
AVL-tree的加入
17
此時有一節點50,其|BF|>1,因此不為AVLtree,其型態為RR型,調整的方法乃將60往上
提,50放在60的左方,如下圖所示:
AVL-tree的加入
18
三、 LR型(左邊的右邊)
假設有一棵AVL-tree如下:
AVL-tree的加入
19
今加入45,則將變為不是一棵AVL-tree,它是屬
於LR型,因為加入的節點45位於節點
50(|BF|>1)的左邊的右邊。
AVL-tree的加入
20
調整的方式將45往上提,比45小的放在左邊,
比45大的放在右邊,結果如下所示:
AVL-tree的加入
21
四、RL型(右邊的左邊)
基本上RL型和LR型大致上類似。有一棵AVL-tree
如下:
AVL-tree的加入
22
今加入節點55後,將變成不是一棵AVL-tree,它
是RL型,因為加入的節點55,位於節點
50(|BF|>1)的右邊的左邊。
AVL-tree的加入
23
調整的方式將55往上提,並將小於55的節點放
在左邊,大於55的節點放在右邊,如下圖所
示:
失去平衡的AVL樹
24
(a ) 情 況 1 : 左 邊 的 左 邊
(b ) 情 況 2 : 右 邊 的 右 邊
失去平衡的AVL樹
25
(c ) 情 況 3 : 左 邊 的 右 邊
(d ) 情 況 4 : 右 邊 的 左 邊
進階 LL型
26
新 增 12 之 後
旋 轉 之 後
簡 單 右 旋 轉
新 增 4 之 後
複 雜 右 旋 轉
旋 轉 之 後
進階 RR型
27
簡 單 左 旋 轉
複 雜 左 旋 轉
進階 LR型
28
簡 單 的 向 右 旋 轉 兩 次
在 右 旋 轉 前 的 樹
旋 轉 前 的 樹
在 右 旋 轉 之 後
複 雜 的 向 右 旋 轉 兩 次
進階 RL型
29
簡 單 的 向 左 旋 轉 兩 次
旋 轉 前 的 樹
向 右 旋 轉 後
向 左 旋 轉 後
複 雜 的 向 左 旋 轉 兩 次
30
在下圖之平衡二元樹,加入 node 11 後,重新調
整之平衡樹為何?
31
AVL-tree的刪除
32
AVL-tree的刪除與二元搜尋樹的刪除相同,當刪
除的動作完成後,再計算平衡因子,作適當
的調整,直到平衡因子的絕對值皆小於等於
1。
1.
2.
3.
4.
找出關鍵路徑,計算路徑上每一節點的平衡
因子。
從樹根開始,找到最後一個平衡因子大於1以
上的節點,稱為關鍵節點。
決定調整種類(LL、RR、RL、LR)。
進行調整,必須保持二元搜尋樹的定義。
AVL-tree的刪除
33
EX1: 如果想要刪除節點50,因為它為一個樹葉
節點,所以可以直接將它刪除。
AVL-tree的刪除
34
AVL-tree的刪除
35
從樹根尋找關鍵節點(遇到第一個BF值的絕對值大
於1的節點)為30,當關鍵節點的BF值大於等於0時
往左子樹、小於0往右子樹找下一個節點,由於節
點30的BF值為2大於等於0,故往pivot節點的左子樹
找到節點20,其BF值大於等於0,找到此可知調整
型態為LL型,不需再往下搜尋。調整結果如下:
AVL-tree的刪除
36
AVL-tree的刪除
37
AVL Tree:
若欲刪除80,可找到
替代節點90(右子樹
中最小的節點),如
下圖所示:
AVL-tree的刪除
38
從樹根尋找關鍵節點,它是90那個節點,其BF
值為2大於0,往其左子樹尋找下一節點的BF值
為-1小於0,由此可知調整型態為LR型,結果如
下: