110 likes | 298 Views
AVL 樹. AVL 樹的定義. AVL 樹是平衡的 AVL 樹是一種 二元搜尋樹 , 其中 對於所有 T 的內部節點 v 而言 , v 的子節點高度最多只會相差 1. AVL 樹的例子,節點旁邊顯示了其高度. AVL 樹的高度. 事實 :儲存 n 個鍵值的 AVL 樹 高度 為 O(log n). 證明 :讓我們求解 n(h) 的界限:高度為 h 之 AVL 樹最少會有多少個內部節點 我們很容易可知 n(1) = 1 與 n(2) = 2
E N D
AVL樹 AVL樹
AVL樹的定義 • AVL 樹是平衡的 • AVL 樹是一種二元搜尋樹,其中對於所有T的內部節點 v 而言,v 的子節點高度最多只會相差1 AVL 樹的例子,節點旁邊顯示了其高度 AVL樹
AVL樹的高度 • 事實:儲存 n 個鍵值的 AVL 樹高度為 O(log n). • 證明:讓我們求解n(h) 的界限:高度為h之AVL樹最少會有多少個內部節點 • 我們很容易可知 n(1) = 1 與 n(2) = 2 • 針對 n > 2,高度為h之AVL 樹包含根節點、一個高度為n-1的AVL子樹、以及另一個高度為n-2的子樹 • 也就是說,n(h) = 1 + n(h-1) + n(h-2) • 已知 n(h-1) > n(h-2),我們可知 n(h) > 2n(h-2)。所以 n(h) > 2n(h-2), n(h) > 4n(h-4), n(h) > 8n(n-6), … (透過歸納法), n(h) > 2in(h-2i) • 求解基本狀況我們可得:n(h) > 2 h/2-1 • 取對數:h < 2log n(h) +2 • 因此AVL樹的高度為 O(log n) AVL樹
AVL樹的插入 • 插入與在二元搜尋樹中相同 • 永遠透過擴展外部節點來完成 • 範例: AVL樹
三節點重構 • 令 (a、b、c) 為x、y、z的中序走訪串列 • 執行要令b成為三節點中最高的節點所需的旋轉 情形2:雙重旋轉 (c 向右旋轉,然後a 向左旋轉) (其他兩種情形是對稱的) 情形1:單一旋轉 (將 a 向左旋轉) AVL樹
插入範例(續) 未平衡… …平衡 AVL樹
重構 (以單一旋轉) • 單一旋轉: 單一旋轉 單一旋轉 AVL樹
重構 (以雙重旋轉) • 雙重旋轉: 雙重旋轉 雙重旋轉 AVL樹
AVL樹的移除 • 移除一開始與二元搜尋樹相同,也就是說被移除的節點會變為空的外部節點。其父節點w可能會產生不平衡的狀況 • 例子: AVL樹
移除後的重新平衡 • 令z為從w沿樹向上走訪所遭遇到第一個未平衡的節點。此外,令y為z擁有較大高度的子節點,然後令x為y擁有較大高度的子節點 • 我們執行 restructure(x) 來復原z的平衡 • 由於此種重構有可能會破壞樹中其他較高節點的平衡,我們必須持續檢查平衡擲到達到T的根節點為止 AVL樹
AVL樹的執行時間 • 單次重構為 O(1) • 使用鏈結結構的二元樹 • 尋找為 O(log n) • 樹的高度為 O(log n),不需重構 • 插入為 O(log n) • 一開始的尋找為 O(log n) • 沿著樹向上進行重構,維護高度為 O(log n) • 移除為 O(log n) • 一開始的尋找為 O(log n) • 沿著樹向上進行重構,維護高度為 O(log n) AVL樹