平衡二叉樹構建過程中的旋轉

2021-07-11 01:50:35 字數 1355 閱讀 2678

若向平衡二叉樹中插入乙個新結點後破壞了平衡二叉樹的平衡性。首先要找出插入新結點後失去平衡的最小子樹根結點的指標。然後再調整這個子樹中有關結點之間的鏈結關係,使之成為新的平衡子樹。當失去平衡的最小子樹被調整為平衡子樹後,原有其他所有不平衡子樹無需調整,整個二叉排序樹就又成為一棵平衡二叉樹。

失去平衡的最小子樹是指以離插入結點最近,且平衡因子絕對值大於 1 的結點作為根的子樹。假設用 a 表示失去平衡的最小子樹的根結點,則調整該子樹的操作可歸納為下列四種情況。(1

)rr 

型平衡旋轉法

由於在 a 的左孩子 b 的左子樹上插入結點 f ,使 a 的平衡因子由 1 增至 2 而失去平衡。故需進行一次順時針旋轉操作。 即將 a 的左孩子 b 向右上旋轉代替 a 作為根結點, a 向右下旋轉成為 b 的右子樹的根結點。而原來 b 的右子樹則變成 a 的左子樹。

2)ll 型平衡旋轉法

由於在 a 的右孩子 c  的右子樹上插入結點 f ,使 a 的平衡因子由 -1 減至 -2 而失去平衡。故需進行一次逆時針旋轉操作。即將 a的右孩子 c 向左上旋轉代替 a 作為根結點, a 向左下旋轉成為 c 的左子樹的根結點。而原來 c 的左子樹則變成 a 的右子樹。

3)lr型平衡旋轉法

由於在 a 的左孩子 b 的右子數上插入結點 f ,使 a 的平衡因子由 1 增至 2 而失去平衡。故需進行兩次旋轉操作(先逆時針,後順時針)。即先將 a 結點的左孩子 b 的右子樹的根結點 d 向左上旋轉提公升到 b 結點的位置,然後再把該 d 結點向右上旋轉提公升到 a 結點的位置。即先使之成為

ll型,再按

ll型處理 。

如圖中所示,即先將圓圈部分先調整為平衡樹,然後將其以根結點接到 a 的左子樹上,此時成為 ll 型,再按 ll 型處理成平衡型。(4

)rl型平衡旋轉法

由於在 a 的右孩子 c 的左子樹上插入結點 f ,使 a 的平衡因子由 -1 減至 -2 而失去平衡。故需進行兩次旋轉操作(先順時針,後逆時針),即先將 a 結點的右孩子 c 的左子樹的根結點 d 向右上旋轉提公升到 c 結點的位置,然後再把該 d 結點向左上旋轉提公升到 a 結點的位置。即先使之成為

rr型,再按

rr型處理。

如圖中所示,即先將圓圈部分先調整為平衡樹,然後將其以根結點接到 a 的左子樹上,此時成為 rr 型,再按 rr 型處理成平衡型。

平衡化靠的是旋轉。 參與旋轉的是 3 個節點(其中乙個可能是外部節點 null ),旋轉就是把這 3 個節點轉個位置。注意的是,左旋的時候 p->right 一定不為空,右旋的時候 p->left 一定不為空,這是顯而易見的。

如果從空樹開始建立,並時刻保持平衡,那麼不平衡只會發生在插入刪除操作上,而不平衡的標誌就是出現

bf == 2

或者bf == -2

的節點。

平衡二叉樹(樹的旋轉)

平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度盡可能小,因此,樹中每個結點的兩棵子樹的深度不要偏差太大。平衡二叉樹的遞迴定義 平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下2個性質 左右子樹深度之差的絕對值不大於1。左右子樹都是平衡二叉樹。平衡因子的概念 ...

平衡二叉樹(樹的旋轉)

平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度盡可能小,因此,樹中每個結點的兩棵子樹的深度不要偏差太大。平衡二叉樹的遞迴定義 平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下2個性質 左右子樹深度之差的絕對值不大於1。左右子樹都是平衡二叉樹。平衡因子的概念 ...

平衡二叉樹的旋轉操作

平衡二叉樹的定義 任意的左右子樹高度差的絕對值不超過1,將這樣的二叉樹稱為平衡二叉樹,二叉平衡樹前提是乙個二叉排序樹。1 ll 插入乙個新節點到根節點的左子樹 left 的左子樹 left 導致根節點的平衡因子由1變為2 2 rr 插入乙個新節點到根節點的右子樹 right 的右子樹 right 導...