9.1 何謂高度平衡二元搜尋樹 9.2 AVL-tree的加入 9.3 AVL-tree的刪除 Chapter 9 高度平衡二元搜尋樹 9.1 何謂高度平衡二元搜尋樹 9.2 AVL-tree的加入 9.3 AVL-tree的刪除
9.1 何謂高度平衡二元搜尋樹 高度平衡二元搜尋樹(height balanced binary search tree)在1962年由Adelson-Velskii 和Landis所提出的,因此又稱為AVL-tree。
9.1 何謂高度平衡二元搜尋樹 AVL-tree定義如下:一棵空樹(empty tree)是高度平二元搜尋樹。假使T不是空的二元搜尋樹,TL和TR分別是此二元搜尋樹的左子樹和右子樹,若符合下列兩個條件,則稱T為高度平衡二元搜尋樹: TL和TR亦是高度平衡二元搜尋樹, |hL-hR| < 1,其中hL及hR分別是TL和TR的高度。
9.1 何謂高度平衡二元搜尋樹 在一棵二元搜尋樹中有一節點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。
9.1 何謂高度平衡二元搜尋樹
9.2 AVL-tree的加入 高度平衡二元搜尋樹可能會因為加入或刪除某節點而形成不平衡狀態,此時須視不平衡狀態是那一類型,之後,再加以調整之。 通常不平衡的狀態可分為LL、RR、LR與RL四大類型。
9.2 AVL-tree的加入 利用加入的節點A與它最接近平衡因子絕對值大於1(|BF|>1)的節點B, 若A在B的左邊的左邊,則為LL型; 若A在B節點的右邊的右邊,則為RR型; 若A在B節點的左邊的右邊,則為LR型; 若A在B節點的右邊的左邊,則稱為RL型。
9.2 AVL-tree的加入 LL型 加入前的AVL-tree: 加入30後的AVL-tree如下: 每個節點的上面數 字表示平衡因子。
9.2 AVL-tree的加入 此時50節點的|BF|>1,因此不為一棵AVL-tree,其調整的方法乃將40往上提,50放在40的右方,如下圖所示:
9.2 AVL-tree的加入 RR型 此RR型與LL型大同小異, 如加入前的AVL-tree為: 加入70後的AVL-tree為:
9.2 AVL-tree的加入 此時有一節點50,其|BF|>1,因此不為AVL-tree,其型態為RR型,調整的方法乃將60往上提,50放在60的左方,如下圖所示:
9.2 AVL-tree的加入 LR型 假設有一棵AVL-tree如下: 今加入45,則將變為不是一棵 AVL-tree,它是屬於LR型, 因為加入的節點45位於節點 50(|BF|>1)的左邊的右邊。
9.2 AVL-tree的加入 調整的方式將45往上提,比45小的放在左邊,比45大的放在右邊,結果如下所示:
9.2 AVL-tree的加入 RL型 基本上RL型和LR型大致上類似。 有一棵AVL-tree如下: 今加入節點55後,將變成不是 一棵AVL-tree,它是RL型,因 為加入的節點55,位於節點 50(|BF|>1)的右邊的左邊。
9.2 AVL-tree的加入 調整的方式將55往上提,並將小於55的節點放在左邊,大於55的節點放在右邊,如下圖所示:
9.3 AVL-tree的刪除 AVL-tree的刪除與二元搜尋樹的刪除相同,當刪除的動作完成後,再計算平衡因子,作適當的調整,直到平衡因子的絕對值皆小於等於1。
9.3 AVL-tree的刪除 假設存在一棵AVL-tree如下:
9.3 AVL-tree的刪除 若欲刪除50,因為它為一樹葉節點,故直接刪除之。
9.3 AVL-tree的刪除 從樹根尋找pivot點(遇到第一個BF值的絕對值大於1的節點)為30,當pivot節點的BF值大於等於0時往左子樹、小於0往右子樹找下一個節點,由於節點30的BF值為2大於等於0,故往pivot節點的左子樹找到節點20,其BF值大於等於0,找到此可知調整型態為LL型,不需再往下搜尋。
9.3 AVL-tree的刪除 調整結果如下:
9.3 AVL-tree的刪除 了解AVL-tree的刪除及其調整方法後,我們再來看一個例子。有一棵AVL-tree如下:
9.3 AVL-tree的刪除 若欲刪除80,可找到替代節點90(右子樹中最小的節點),如下圖所示:
9.3 AVL-tree的刪除 從樹根尋找pivot節點,它是90那個節點,其BF值為2大於0,往其左子樹尋找下一節點的BF值為-1小於0,由此可知調整型態為LR型,結果如下: