在數據結構的教材中,對二叉平衡樹的旋轉操作敘述很是模糊,為此經過在網上查詢了解並收藏了以下操作方法。
平衡二叉樹的操作
二叉查找樹如何在添加數據的同時保持平衡呢?基本思想就是:當在二叉排序樹中插入一個節點時,首先檢查是否因插入而破壞了平衡,若 破壞,則找出其中的最小不平衡二叉樹,在保持二叉排序樹特性的情況下,調整最小不平衡子樹中節點之間的關系,以達 到新的平衡。所謂最小不平衡子樹 指離插入節點最近且以平衡因子的絕對值大於1的節點作為根的子樹
1. 查找操作
平衡二叉樹的查找基本與二叉查找樹相同。
2. 插入操作
在平衡二叉樹中插入結點與二叉查找樹最大的不同在於要隨時保證插入后整棵二叉樹是平衡的。那么調整不平衡樹的基本方法就是: 旋轉 。 下面我們歸納一下平衡旋轉的4中情況
1) 繞某元素左旋轉
80 90
/ \ 左旋 / \
60 90 ---- -> 80 120
/ \ / \ /
85 120 60 85 100
/
100
a) BST樹 b ) AVL樹
分析一下:在插入數據100之前,a圖的B ST樹只有80節點的平衡因子是-1(左高-右高),但整棵樹還是平衡的。加入100之后,80節點的平衡因子就成為了-2,此時平衡被破壞。需要左旋轉成b 圖。
當樹中節點X的右孩子的右孩子上插入新元素,且平衡因子從-1變成-2后,就需要繞節點X進行左旋轉。
2) 繞某元素右旋轉
100 85
/ \ 右旋 / \
85 120 ------ -> 60 100
/ \ \ / \
60 90 80 90 120
\
80
a) B ST樹 b) AVL樹
當樹中節點X的左孩子的左孩子上插入新元素,且平衡因子從1變成2后,就需要繞節點X進行右旋轉。
3) 繞某元素的左子節點左旋轉,接着再繞該元素自己右旋轉。 此情況下就是左旋與右旋 的結合,具體操作時可以分 解成這兩種操作,只是圍繞點不一樣而已。
100 100 90
/ \ 左旋 / \ 右旋 / \
80 120 ------> 90 120 ------> 80 100
/ \ / / \ \
60 90 80 60 85 120
/ / \
85 60 85
當樹中節點X的左孩子的右孩子上插入新元素,且 平衡因子從1變成2后,就需要 先繞X的左子節點Y左旋轉,接着再繞X右旋轉
4) 繞某元素的右子節點右旋轉,接着再繞該元素自己左旋轉。 此情況下就是 右旋與左旋 的結合,具體操作時可以分解 成這兩種操作,只是圍繞點不一樣而已 。
80 80 85
/ \ 右 旋 / \ 左 旋 / \
60 100 ------> 60 85 -------> 80 100
/ \ \ / / \
85 120 100 60 90 120
\ / \
90 90 120
當樹中節點X的右孩子的左孩子上插入新元素,且 平衡因子從-1變成-2后,就需要 先繞X的右子節點Y右旋轉,接着再繞X左旋轉