170 likes | 283 Vues
Chapter 8 高度平衡二元搜尋樹. 8.1 何謂高度平衡二元搜尋樹 8.2 高度平衡二元搜尋樹的加入 8.3 高度平衡二元搜尋樹的刪除. 8.1 何謂高度平衡二元搜尋 樹. 何謂高度平衡二元樹 (height balanced binary tree) ? 空樹 (empty tree) 是高度平衡二元樹 假使 T 不是空的二元樹, T L 和 T R 分別是此二元樹的左子樹和右子樹,若符合下列二個條件,則稱 T 為高度平衡二元樹,也稱為 AVL-Tree 。 TL 和 TR 亦是高度平衡二元樹,
E N D
Chapter 8 高度平衡二元搜尋樹 8.1 何謂高度平衡二元搜尋樹 8.2 高度平衡二元搜尋樹的加入 8.3 高度平衡二元搜尋樹的刪除
8.1 何謂高度平衡二元搜尋樹 • 何謂高度平衡二元樹(height balanced binary tree)? • 空樹(empty tree)是高度平衡二元樹 • 假使T不是空的二元樹,TL和TR分別是此二元樹的左子樹和右子樹,若符合下列二個條件,則稱T為高度平衡二元樹,也稱為AVL-Tree。 • TL和TR亦是高度平衡二元樹, • |hL-hR|≦1,其中hL及hR分別是TL和TR的高度; • hL-hR為平衡因子(balanced factor,BF),在AVL-Tree中,每一節點的平衡因子為-1、0或1
8.1 何謂高度平衡二元搜尋樹 • 一棵二元樹的平衡因子
8.2 高度平衡二元搜尋樹的加入 • 高度平衡二元搜尋樹在加入或刪除後,可能會造成不平衡,此時可利用LL,RR,LR,RL 等四種不同的調整方式,使其符合AVL-tree 的定義。 • 1. LL:加入的新節點N 在節點p 的左邊的左邊。 • 2. RR:加入的新節點N 在節點p 的右邊的右邊。 • 3. LR:加入的新節點N 在節點p 的左邊的右邊。 • 4. RL:加入的新節點N 在節點p 的右邊的左邊。
8.2 高度平衡二元搜尋樹的加入 • LL型:加入新節點於節點s的左子樹之左子樹 2 0 50 50 40 加入30 調整 1 0 0 40 50 40 30 0 不是一棵AVL-tree 30
8.2 高度平衡二元搜尋樹的加入 例二: 1 2 50 50 40 0 0 0 1 0 0 加入20 調整 60 60 50 40 40 30 0 0 1 0 0 0 0 45 45 60 30 30 20 45 0 20
8.2 高度平衡二元搜尋樹的加入 • RR型:加入新節點於節點s的右子樹之右子樹 • 此RR型與LL型大同小異,如加入前的AVL-tree為: 0 0 -2 加入70 調整 60 50 50 0 0 0 -1 70 50 60 60 0 70 不是一棵AVL-tree
8.2 高度平衡二元搜尋樹的加入 例二: -1 -2 60 50 50 加入80 調整 0 0 0 0 0 -1 70 50 60 60 40 40 0 0 0 0 0 0 -1 80 40 55 70 70 55 55 0 80
8.2 高度平衡二元搜尋樹的加入 • LR型:加入新節點於節點s的左子樹之右子樹 2 50 45 50 加入45 調整 -1 40 40 50 40 0 45
8.2 高度平衡二元搜尋樹的加入 例二: 2 50 50 -1 0 加入42 60 40 60 40 0 1 30 35 30 35 0 42
8.2 高度平衡二元搜尋樹的加入 45 調整 50 40 60 30 42
8.2 高度平衡二元搜尋樹的加入 • RL型:加入新節點於節點s的右子樹之左子樹 -2 加入56 調整 56 50 50 1 60 60 60 60 0 56
8.2 高度平衡二元搜尋樹的加入 例二: -1 -2 加入52 56 調整 50 50 0 0 0 0 0 1 60 50 60 60 40 40 0 0 0 0 0 1 0 70 40 52 70 70 56 56 0 52
8.3 高度平衡二元搜尋樹的刪除 • 高度平衡二元搜尋樹的刪除方法與二元搜尋樹相同,當刪除的動作完成後,必需再計算平衡因子,並做適當的調整。
8.3 高度平衡二元搜尋樹的刪除 • 假設存在一棵AVL-tree如左下圖,若欲刪除50,因為它為一樹葉節點,故直接刪除之,成為右下圖,刪除後再進行調整 2 -1 調整 加入50 30 20 30 0 0 1 20 50 10 30 20 0 0 0 10 25 10 25 25
8.3 高度平衡二元搜尋樹的刪除 • 從樹根尋找pivot點(遇到第一個BF值的絕對值大於1的節點) • 由pivot節點的BF值大於等於0時往左子樹、小於0則往右子樹找下一個節點,來決定調整的型態。
8.3 高度平衡二元搜尋樹的刪除 • 調整規則如下: • 當pivot.BF >= 0 • pivot.llink.BF >= 0 LL型 • pivot.llink.BF < 0 LR型 • 當pivot.BF < 0 • pivot.rlink.BF >= 0 RL型 • pivot.rlink.BF < 0 RR型