Chapter 9 高度平衡二元樹:AVL tree,斜張樹 - Ian-Liu-1990/Data-Structure GitHub Wiki

1. AVL tree

1. 定義滿足條件,需求,甚至解釋什麼是AVL-Tree都TMD指同一件事

  1. 可以是一棵空的二元搜尋樹T

  2. 若T為非空的二元搜尋樹,且其每個節點的左,右子樹分別為TL和TR,若滿足

    1. TL與TR必須皆同時為高度平衡二元搜尋樹
    2. |hL-hR| <= 1,其中hL與hR分別為TL與TR的高度
  3. 非空T的每個節點的左右子樹高度必須相差不得超過1,是高度平衡樹

2. 平衡因子[AVL樹特性與檢查]

一棵二元搜尋樹的任意節點n,平衡因子BF(n) = hL-hR,BF(n)必須只能是-1,0,+1,其中hL與hR分別為節點n的左子樹TL與右子樹TR的高度

3. BST VS BST又符合AVL的特性

富比尼 1 2 3 4 5
0 1 1 2 3 5
操作 BST的時間複雜度 BST-AVL的時間複雜度
搜尋 與樹高有關O(Ht) 尋找,平均和最壞情況下O(logn)
插入 與樹高有關O(Ht) 插入,平均和最壞情況下O(logn)
刪除 與樹高有關O(Ht) 刪除,平均和最壞情況下O(logn)
建一棵樹 O(N^2)~O(NlogN) O(NlogN)

4. 插入與刪除造成的4個不平衡狀況

  1. 插入 : 是一棵二分搜尋樹,依照二分搜尋樹規則插入,每次從插入的點往樹根方向檢查最鄰近有問題的平衡因子由平衡因子決定方向檢查LL,RR,LR,RL
  2. 刪除 : 是一棵二分搜尋樹,依照二分搜尋樹規則刪除

5. 插入/刪除調整規則

  1. LL : 從失去平衡的根開始L(路徑)-L(路徑)-L(路徑) 或 從失去平衡的根開始L(路徑)-L(路徑)-R(路徑)

    1. L(路徑)-L(路徑)之間的節點向上拉當作根

    2. 新Root的右子樹為原本的父節點,新Root的原本右子樹成為原本父節點的左子樹

    3. 新Root的左子樹為新Root的原本左子樹

  2. RR : 從失去平衡的根開始R(路徑)-R(路徑)-R(路徑) 或 從失去平衡的根開始R(路徑)-R(路徑)-L(路徑)

    1. R(路徑)-R(路徑)之間的節點向上拉當作根

    2. 新Root的左子樹為原本的父節點,新Root的原本左子樹成為原本父節點的右子樹

    3. 新Root的右子樹為新Root的原本右子樹

  3. LR : 從失去平衡的根開始N1-L(路徑)-N2-R(路徑)-N3

    1. L(路徑)-R(路徑)最後的節點N3向上拉當作根

    2. N1 > N3N1變成N3的右子樹,若N3有右子樹則N3的右子樹變成N1的左子樹

    3. N2 < N3N2變成N2的左子樹,若N3有左子樹則N3的左子樹變成N2的右子樹

  4. RL : 從失去平衡的根開始N1-R(路徑)-N2-L(路徑)-N3

    1. R(路徑)-L(路徑)最後的節點N3向上拉當作根

    2. N1 < N3N1變成N3的左子樹,若N3有左子樹則N3的左子樹變成N1的右子樹

    3. N2 > N3N2變成N3的左子樹,若N3有右子樹則N3的右子樹變成N1的左子樹


AVL Tree 樹高H,最多含有多少節點? 最少含有多少節點?

考題集合


2. 斜張樹Splay Tree

  1. 搜尋 :

  2. 插入 :

  3. 刪除 :