2.8.5 - AVL Tree

1. 介紹

當我們處理的資料是動態的時候(Dynamic Data),二元搜尋樹有可能形成skewed的結構,造成Search()/Insert()/Delete()等運作的時間複雜度變為O(n)。因此引入AVL Tree來動態維持樹的高度,保持在最小的情況。

  1. 對任何一節點來說,左右子樹的高度差 ≤ 1

  2. 對任何一節點來說,左右子樹皆是AVL Tree

  3. Node's Balance Factor: HLHRH_{L}-H_{R} ,AVL Tree中任何一點的值僅會是{0、1、-1}

2. 運作

2.1 AVL Tree不平衡的情況

加入新的節點可能造成不平衡的情況:

1.LL

2.LR

3.RL

4.RR

2.2 AVL Tree不平衡的情況調整原則

  1. 中間鍵值往上拉,小的放左,大的放右。

  2. 若有孤兒子點/樹,依照Binary Search Tree擺到正確位置。

3. AVL Tree定理

形成高度 HH 的AVL Tree所需最少的節點數為 FH+21F_{H+2}-1最多節點數為2H12^H-1

使用數學歸納法證明:

  1. 高度為0時為空樹, F21=0F_{2}-1=0 成立

  2. 假設高度為 H1H-1 時,此定理成立

  3. 當高度為 HH 時,假設左子樹高度為 H1H-1 ,右子樹 H2H-2

根據2.假設,

左子樹最少節點數= F(H1)+21=FH+11F_{(H-1)+2}-1=F_{H+1}-1

右子樹最少節點數= F(H2)+21=FH1F_{(H-2)+2}-1=F_{H}-1

所以整棵樹最少節點樹為 =(FH+11)+(FH1)+1=FH+1+FH1=FH+21=(F_{H+1}-1)+(F_{H}-1)+1\\=F_{H+1}+F_{H}-1\\=F_{H+2}-1

4. 比較

Array

LinkList

AVL Tree

search(x)

O(logn)

O(n)

O(logn)

search(kth)

O(1)

O(k)

O(logn)

delete(x)

O(n)

O(1)

O(logn)

delete(kth)

O(n-k)

O(k)

O(logn)

insert(x)

O(n)

O(1)

O(logn)

output in order

O(n)

O(n)

O(n)

Last updated