二叉查找樹
二叉樹具有以下性質:左子樹的鍵值小於根的鍵值,右子樹的鍵值大於根的鍵值。
二叉查找樹可以任意地構造,也可以按照下圖的方式來構造:
但是這棵二叉樹的查詢效率就低了。因此若想二叉樹的查詢效率盡可能高,需要這棵二叉樹是平衡的,從而引出新的定義——平衡二叉樹,或稱AVL樹。
平衡二叉樹(AVL Tree)
平衡二叉樹(AVL樹)在符合二叉查找樹的條件下,還滿足任何節點的兩個子樹的高度最大差為1。
如果在AVL樹中進行插入或刪除節點,可能導致AVL樹失去平衡,這種失去平衡的二叉樹可以概括為四種姿態:LL(左左)、RR(右右)、LR(左右)、RL(右左)。它們的示意圖如下:
這四種失去平衡的姿態都有各自的定義:
LL:LeftLeft,也稱“左左”。插入或刪除一個節點后,根節點的左孩子(Left Child)的左孩子(Left Child)還有非空節點,導致根節點的左子樹高度比右子樹高度高2,AVL樹失去平衡。
RR:RightRight,也稱“右右”。插入或刪除一個節點后,根節點的右孩子(Right Child)的右孩子(Right Child)還有非空節點,導致根節點的右子樹高度比左子樹高度高2,AVL樹失去平衡。
LR:LeftRight,也稱“左右”。插入或刪除一個節點后,根節點的左孩子(Left Child)的右孩子(Right Child)還有非空節點,導致根節點的左子樹高度比右子樹高度高2,AVL樹失去平衡。
RL:RightLeft,也稱“右左”。插入或刪除一個節點后,根節點的右孩子(Right Child)的左孩子(Left Child)還有非空節點,導致根節點的右子樹高度比左子樹高度高2,AVL樹失去平衡。
AVL樹失去平衡之后,可以通過旋轉使其恢復平衡。下面分別介紹四種失去平衡的情況下對應的旋轉方法。
LL的旋轉。LL失去平衡的情況下,可以通過一次旋轉讓AVL樹恢復平衡。步驟如下:
- 將根節點的左孩子作為新根節點。
- 將新根節點的右孩子作為原根節點的左孩子。
- 將原根節點作為新根節點的右孩子。
LL旋轉示意圖如下:
RR的旋轉:RR失去平衡的情況下,旋轉方法與LL旋轉對稱,步驟如下:
- 將根節點的右孩子作為新根節點。
- 將新根節點的左孩子作為原根節點的右孩子。
- 將原根節點作為新根節點的左孩子。
RR旋轉示意圖如下:
LR的旋轉:LR失去平衡的情況下,需要進行兩次旋轉,步驟如下:
- 圍繞根節點的左孩子進行RR旋轉。
- 圍繞根節點進行LL旋轉。
LR的旋轉示意圖如下:
RL的旋轉:RL失去平衡的情況下也需要進行兩次旋轉,旋轉方法與LR旋轉對稱,步驟如下:
- 圍繞根節點的右孩子進行LL旋轉。
- 圍繞根節點進行RR旋轉。
RL的旋轉示意圖如下: