平衡二叉樹的插入刪除操作


平衡二叉樹(Balanced binary tree)是由阿德爾森-維爾斯和蘭迪斯(Adelson-Velskii and Landis)1962年首先提出的,所以又稱為AVL樹。

定義:平衡二叉樹或為空樹,或為如下性質的二叉排序樹:

  1)左右子樹深度之差的絕對值不超過1;

  2)左右子樹仍然為平衡二叉樹.

      平衡因子BF=左子樹深度-右子樹深度.

平衡二叉樹每個結點的平衡因子只能是10-1。若其絕對值超過1,則該二叉排序樹就是不平衡的。

如圖所示為平衡樹和非平衡樹示意圖:

二、平衡二叉樹算法思想

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

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

 1LL型平衡旋轉法

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

2RR型平衡旋轉法

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

3LR型平衡旋轉法

由於在A的左孩子B的右子數上插入結點F,使A的平衡因子由1增至2而失去平衡。故需進行兩次旋轉操作(先逆時針,后順時針)。即先將A結點的左孩子B的右子樹的根結點D左上旋轉提升到B結點的位置,然后再把該D結點向右上旋轉提升到A結點的位置。即先使之成為LL型,再按LL型處理

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

4RL型平衡旋轉法  

由於在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的節點。

----------------------------------------------------------

刪除節點:

比如要下從下圖中刪除節點20


首先找到替換20被刪除的節點15,並將二者內容替換,如下圖所示:


然后刪除節點20得到下圖:


在刪除節點20后,節點10違反了平衡二叉樹的性質,對以10為根節點的子樹進行調整(類似於插入時,需要先做一次左旋再做一次右旋)可得下圖:

 

另一種情形如下圖所示:

另一種情形如下圖所示:

 

 

另一種情形如下圖所示:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM