當我們處理的資料是動態的時候(Dynamic Data),二元搜尋樹有可能形成skewed的結構,造成Search()/Insert()/Delete()等運作的時間複雜度變為O(n)。因此引入AVL Tree來動態維持樹的高度,保持在最小的情況。
對任何一節點來說,左右子樹的高度差 ≤ 1
對任何一節點來說,左右子樹皆是AVL Tree
Node's Balance Factor: HL−HRH_{L}-H_{R}HL−HR ,AVL Tree中任何一點的值僅會是{0、1、-1}
加入新的節點可能造成不平衡的情況:
1.LL
2.LR
3.RL
4.RR
中間鍵值往上拉,小的放左,大的放右。
若有孤兒子點/樹,依照Binary Search Tree擺到正確位置。
形成高度 HHH 的AVL Tree所需最少的節點數為 FH+2−1F_{H+2}-1FH+2−1 ;最多節點數為2H−12^H-12H−1
使用數學歸納法證明:
高度為0時為空樹, F2−1=0F_{2}-1=0F2−1=0 成立
假設高度為 H−1H-1H−1 時,此定理成立
當高度為 HHH 時,假設左子樹高度為 H−1H-1H−1 ,右子樹 H−2H-2H−2
根據2.假設,
左子樹最少節點數= F(H−1)+2−1=FH+1−1F_{(H-1)+2}-1=F_{H+1}-1F(H−1)+2−1=FH+1−1
右子樹最少節點數= F(H−2)+2−1=FH−1F_{(H-2)+2}-1=F_{H}-1F(H−2)+2−1=FH−1
所以整棵樹最少節點樹為 =(FH+1−1)+(FH−1)+1=FH+1+FH−1=FH+2−1=(F_{H+1}-1)+(F_{H}-1)+1\\=F_{H+1}+F_{H}-1\\=F_{H+2}-1=(FH+1−1)+(FH−1)+1=FH+1+FH−1=FH+2−1
Array
LinkList
AVL Tree
search(x)
O(logn)
O(n)
search(kth)
O(1)
O(k)
delete(x)
delete(kth)
O(n-k)
insert(x)
output in order
Last updated 7 years ago