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