# 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:** $$H\_{L}-H\_{R}$$ ，AVL Tree中任何一點的值僅會是{0、1、-1}

### 2. 運作

#### 2.1 AVL Tree不平衡的情況

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

1.**LL**

![](https://2769815795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGckN3OAfinKuVIrkMj%2F-LHqFwkm5DhApvotU0Nc%2F-LHqH6xy-c0NiTGG36Li%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-07-20%2014.01.49.jpg?alt=media\&token=a22a02db-d68c-4754-a8cc-5ce647bdb7f3)

2.**LR**

![](https://2769815795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGckN3OAfinKuVIrkMj%2F-LHqFwkm5DhApvotU0Nc%2F-LHqHJPf_IIBdjWHLzUM%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-07-20%2014.03.21.jpg?alt=media\&token=beb5b3ae-966b-4df6-adf6-e6c72e322e48)

3.**RL**

![](https://2769815795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGckN3OAfinKuVIrkMj%2F-LHqFwkm5DhApvotU0Nc%2F-LHqHS29fTWx9_YTu_ju%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-07-20%2014.03.58.jpg?alt=media\&token=cc17d45d-db8a-4f3a-b632-d1fec75957d3)

4.**RR**

![](https://2769815795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGckN3OAfinKuVIrkMj%2F-LHqFwkm5DhApvotU0Nc%2F-LHqHZ6B4jSuBJvz883s%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-07-20%2014.04.28.jpg?alt=media\&token=dc06317a-6029-4784-897a-2ec5b172da69)

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

1. 中間鍵值往上拉，小的放左，大的放右。
2. 若有孤兒子點/樹，依照Binary Search Tree擺到正確位置。

![](https://2769815795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGckN3OAfinKuVIrkMj%2F-LHqHbnVayAfFVzW4AJ_%2F-LHqIssMTy_0HsRL40U2%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-07-20%2014.10.13.jpg?alt=media\&token=38f55549-6333-4968-ad65-2528953d7a5b)

![](https://2769815795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGckN3OAfinKuVIrkMj%2F-LHqHbnVayAfFVzW4AJ_%2F-LHqJ55cqJxhuNU6Qmec%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-07-20%2014.11.08.jpg?alt=media\&token=a3488f22-3860-43c0-ad45-da1c7a362287)

![](https://2769815795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGckN3OAfinKuVIrkMj%2F-LHqHbnVayAfFVzW4AJ_%2F-LHqJIOEXC-3OO3Syzvs%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-07-20%2014.12.01.jpg?alt=media\&token=fa0b2d20-c6ac-47ca-8ee3-4c4d8567d222)

![](https://2769815795-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGckN3OAfinKuVIrkMj%2F-LHqHbnVayAfFVzW4AJ_%2F-LHqJZzUK48v0LVa1ct7%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-07-20%2014.13.15.jpg?alt=media\&token=a8fd960e-692c-4ed5-b3af-ca396b3cc312)

### 3. AVL Tree定理

形成高度 $$H$$ 的AVL Tree所需**最少**的節點數為 $$F\_{H+2}-1$$ ；**最多**節點數為$$2^H-1$$&#x20;

使用數學歸納法證明:

1. 高度為0時為空樹， $$F\_{2}-1=0$$ 成立
2. 假設高度為 $$H-1$$ 時，此定理成立
3. 當高度為 $$H$$ 時，假設左子樹高度為 $$H-1$$ ，右子樹 $$H-2$$&#x20;

根據2.假設，

左子樹最少節點數= $$F\_{(H-1)+2}-1=F\_{H+1}-1$$&#x20;

右子樹最少節點數= $$F\_{(H-2)+2}-1=F\_{H}-1$$&#x20;

所以整棵樹最少節點樹為 $$=(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)         |
