430 likes | 743 Vues
高度平衡二元搜尋樹. 授課老師:蕭志明. 何謂高度平衡二元搜尋樹. 1962 年,兩位蘇聯 數學家 , G.M.Adelson-Velskii 與 E.M.Landis 建立這個平衡的二元樹結構。 樹的取名,就是依據他們的名字─ AVL 樹。 AVL 樹就是子樹的高度差不超過 1 的搜尋樹。. 兩棵二元搜尋樹. 建立下列數字之二元搜尋樹 依序 8,12,14,18,20,23,44,52 依序 23,18,12,8,14,20,44,52. 兩棵二元搜尋樹 . 依序 8,12,14,18,20,23,44,52 .
E N D
高度平衡二元搜尋樹 授課老師:蕭志明
何謂高度平衡二元搜尋樹 • 1962年,兩位蘇聯數學家,G.M.Adelson-Velskii與E.M.Landis建立這個平衡的二元樹結構。 • 樹的取名,就是依據他們的名字─AVL樹。 • AVL樹就是子樹的高度差不超過1的搜尋樹。
兩棵二元搜尋樹 • 建立下列數字之二元搜尋樹 • 依序 8,12,14,18,20,23,44,52 • 依序 23,18,12,8,14,20,44,52
兩棵二元搜尋樹 依序 8,12,14,18,20,23,44,52 依序 23,18,12,8,14,20,44,52
何謂高度平衡二元搜尋樹 一棵空樹(empty tree)是高度平二元搜尋樹。假使T不是空的二元搜尋樹,TL和TR分別是此二元搜尋樹的左子樹和右子樹,若符合下列兩個條件,則稱T為高度平衡二元搜尋樹:(1)TL和TR亦是高度平衡二元搜尋樹。 (2)|hL-hR| ≤ 1,其中hL及hR分別是TL和TR的高度。
何謂高度平衡二元搜尋樹 在一棵二元搜尋樹中有一節點p,其左子樹 (TL) 和右子樹 (TR) 的高度分別是hL和hR,而BF(p)表示p節點的平衡因子(balanced factor)。平衡因子之計算為hL-hR。在一棵AVL-tree裡,每一節點的平衡因子為-1或零或1,即 |BF(p) | ≤ 1。
何謂高度平衡二元搜尋樹 圖9-1不是一棵AVL-tree,因為M節點的平衡因子是-2。
AVL-tree的加入 • 高度平衡二元搜尋樹可能會因為加入或刪除某節點而形成不平衡狀態,此時須視不平衡狀態是那一類型,之後,再加以調整之。 • 通常不平衡的狀態可分為LL、RR、LR與RL四大類型。
AVL-tree的加入 利用加入的節點A與它最接近平衡因子絕對值大於1(|BF|>1)的節點B: • 若A在B的左邊的左邊,則為LL型。 • 若A在B節點的右邊的右邊,則為RR型。 • 若A在B節點的左邊的右邊,則為LR型。 • 若A在B節點的右邊的左邊,則稱為RL型。
AVL 樹的不平衡點調整之四種型式 (1)LL型 (2)RR型 (3)LR型 (4)RL型
AVL 樹之平衡調整步驟 • 找出關鍵路徑,計算路徑上每一節點的平衡因子。 • 從樹根開始,找到最後一個平衡因子大於1以上的節點,稱為關鍵節點。 • 決定調整種類(LL、RR、RL、LR)。 • 進行調整,必須保持二元搜尋樹的定義。
AVL-tree的加入 一、 LL型(左邊的左邊) 加入前的AVL-tree如下:
AVL-tree的加入 加入30後的AVL-tree如下:每個節點的上面數字表示平衡因子。
AVL-tree的加入 此時50節點的|BF|>1,因此不為一棵AVL-tree,其調整的方法乃將40往上提,50放在40的右方,如下圖所示:
AVL-tree的加入 二、 RR型(右邊的右邊) 此RR型與LL型大同小異,如加入前的AVL-tree為:
AVL-tree的加入 加入70後的AVL-tree為:
AVL-tree的加入 此時有一節點50,其|BF|>1,因此不為AVL-tree,其型態為RR型,調整的方法乃將60往上提,50放在60的左方,如下圖所示:
AVL-tree的加入 三、 LR型(左邊的右邊) 假設有一棵AVL-tree如下:
AVL-tree的加入 今加入45,則將變為不是一棵AVL-tree,它是屬於LR型,因為加入的節點45位於節點50(|BF|>1)的左邊的右邊。
AVL-tree的加入 調整的方式將45往上提,比45小的放在左邊,比45大的放在右邊,結果如下所示:
AVL-tree的加入 四、RL型(右邊的左邊) 基本上RL型和LR型大致上類似。有一棵AVL-tree如下:
AVL-tree的加入 今加入節點55後,將變成不是一棵AVL-tree,它是RL型,因為加入的節點55,位於節點50(|BF|>1)的右邊的左邊。
AVL-tree的加入 調整的方式將55往上提,並將小於55的節點放在左邊,大於55的節點放在右邊,如下圖所示:
AVL-tree的刪除 AVL-tree的刪除與二元搜尋樹的刪除相同,當刪除的動作完成後,再計算平衡因子,作適當的調整,直到平衡因子的絕對值皆小於等於1。 • 找出關鍵路徑,計算路徑上每一節點的平衡因子。 • 從樹根開始,找到最後一個平衡因子大於1以上的節點,稱為關鍵節點。 • 決定調整種類(LL、RR、RL、LR)。 • 進行調整,必須保持二元搜尋樹的定義。
AVL-tree的刪除 若欲刪除50,因為它為一樹葉節點,故直接刪除之。
AVL-tree的刪除 從樹根尋找關鍵節點(遇到第一個BF值的絕對值大於1的節點)為30,當關鍵節點的BF值大於等於0時往左子樹、小於0往右子樹找下一個節點,由於節點30的BF值為2大於等於0,故往pivot節點的左子樹找到節點20,其BF值大於等於0,找到此可知調整型態為LL型,不需再往下搜尋。調整結果如下:
AVL-tree的刪除 了解AVL-tree的刪除及其調整方法後,我們再來看一個例子。有一棵AVL-tree如下:
AVL-tree的刪除 若欲刪除80,可找到替代節點90(右子樹中最小的節點),如下圖所示:
AVL-tree的刪除 從樹根尋找關鍵節點,它是90那個節點,其BF值為2大於0,往其左子樹尋找下一節點的BF值為-1小於0,由此可知調整型態為LR型,結果如下:
練習 在下圖之平衡二元樹,加入 node 11 後,重新調整之平衡樹為何?
高度為 n 的 AVL tree 之節點計算 由於 N0 = 0 , N1 = 1 , 可推知 Nh = F(h+2) -1 , 其中 F(h+2) 為費式級數的第 h+2 項。
練習 一個高度為 8 的 AVL tree 最少需要幾個節點? 【解】 N8 = F(8+2) -1 = F10 -1 = 55 - 1= 54