數據結構(35)平衡二叉樹

 

目錄

1、平衡二叉樹(BBT,Binary Balance Tree)的定義

2、平衡二叉樹的插入

2.1、LL平衡旋轉(右單旋轉)。

2.2、RR平衡旋轉(左單旋轉)

3)LR平衡旋轉(先左後右雙旋轉)

2.4、RL平衡旋轉(先右後左雙旋轉)

3、平衡二叉樹的查找


1、平衡二叉樹(BBT,Binary Balance Tree)的定義

爲了避免樹的高度增長過快,降低二叉排序樹的性能,規定在插入和刪除二叉樹結點時,要保證任意結點的左、右子樹高度差不超過1,將這樣的二叉樹稱爲平衡二叉樹,簡稱平衡樹。定義結點左子樹與右子樹的高度差爲該結點的平衡因子,則平衡二叉樹結點的平衡因子的值只可能是-1、0或1。

因此,平衡二叉樹可定義爲或者使一棵空樹,或者是具有下列性質的二叉樹:它的左子樹和右子樹都是平衡二叉樹。且左子樹和右子樹的高度差的絕對值不超過1。

 圖35-1  平衡二叉樹與不平衡的二叉樹(結點中的值爲該結點的平衡因子)

2、平衡二叉樹的插入

二叉排序樹保證平衡的基本思想如下:每當在二叉排序樹中插入(或刪除)一個結點時,首先檢查其插入路徑上的結點是否因爲此次操作導致了不平衡。若導致了不平衡,則先找到插入路徑上距離插入結點最近的平衡因子的絕對值大於1的結點A,再對以A爲根的子樹,在保持二叉排序樹特性的前提下,調整各結點的位置關係,使之重新達到平衡。

注意:每次調整的對象都是最小不平衡子樹,即以插入路徑上離插入結點最近的平衡因子的絕對值大於1的結點作爲根的子樹。圖

35-1中的虛線框內未最小不平衡子樹。

                                                               圖35-1  最小不平衡子樹

平衡二叉樹的插入過程的前半部分與二叉排序樹相同,但在新結點插入後,若造成查找路徑上的某個結點不再平衡,則需要作出相應調整。可將調整規律歸納爲下列4種情況:

2.1、LL平衡旋轉(右單旋轉)。

由於在結點A的左孩子(L)的左子樹(L)上插入了新結點,A的平衡因子由1增至2,導致以A爲根的子樹失去平衡,需要一次向右的旋轉操作。將A的左孩子B向右上旋轉代替A成爲根節點,將A結點向右下旋轉稱爲B的右子樹的根節點,而B的原右子樹成爲A結點的左子樹。

                                                       圖35-2  LL平衡旋轉

2.2、RR平衡旋轉(左單旋轉)

由於在結點A的右孩子(R)的右子樹(R)上插入新結點,A的平衡因子由-1變成了-2,導致以A爲根的子樹失去平衡,需要一次向左的旋轉操作,將A的右孩子B向左上旋轉提到A成爲根節點,將A結點向左下旋轉成B的左子樹的根節點。而B的原左子樹則作爲A結點的右子樹。如圖35-3所示。

                                                      圖35-3  RR平衡旋轉

3)LR平衡旋轉(先左後右雙旋轉)

由於在A的左孩子(L)的右子樹(R)上插入新結點,A的平衡因子由1增加至2。導致以A爲根的子樹失去平衡,需要進行兩次旋轉操作,先左旋轉後右旋轉。先將A結點的左孩子B的右子樹的根節點C向左上旋轉提升到B結點的位置,然後再將該C結點向右上旋轉提升到A結點的位置,A結點右下旋轉稱爲新的根節點C的右子樹的根節點,C的原來右子樹則作爲A結點的左子樹,C的原來的左子樹作爲C的新的左子樹的根節點B的右子樹。

                                                    圖35-4  LR平衡旋轉

2.4、RL平衡旋轉(先右後左雙旋轉)

由於在A的右孩子(R)的左子樹(L)上插入新結點,A的平衡因子由-1減至-2,導致以A爲根的子樹失去平衡,需要兩次旋轉操作,先右旋轉後左旋轉,先將A結點的右孩子的B的左子樹的根節點C向右上旋轉提升到B結點的位置,然後再把該C結點向左上旋轉提升到A結點的位置。A結點左下旋轉稱爲新的根節點C的左子樹的根節點。C的原來左子樹成爲新的根節點C的左子樹的根節點A的右子樹。而C原來的右子樹成爲根節點C的右子樹的根節點B的左子樹。

                                              圖35-5  RL平衡旋轉

假設關鍵字序列爲{15,3,7,10 .9.8},通過該序列生成平衡二叉樹的過程如圖35-6所示。在圖35-6(d)插入7後導致不平衡,最小不平衡子樹的根爲15,插入位置爲其左孩子的右子樹,故執行LR旋轉,先左後右雙旋轉,調整後的結果如圖35-6(e)所示。在35-6中插入9後導致不平衡,最小不平衡子樹的根爲15,插入位置爲其左孩子的左子樹,故執行LL旋轉,右單旋轉,調整後的結果如圖35-6(h)所示。圖35-6(i)插入8後導致不平衡,最小不平衡子樹的根爲7,插入位置爲其右孩子的左子樹,故執行RL旋轉,先右後左雙旋轉,調整後的結果如圖35-6(j)所示。

                                             圖35-6  平衡二叉樹的生成過程

3、平衡二叉樹的查找

在平衡二叉樹上進行查找的過程與二叉排序樹的相同。因此,在查找過程中,與給定值進行比較的關鍵字個數不超過樹的深度。假設以Nh表示深度爲h的平衡樹中含有的最少結點數。顯然,有N0=0,N1=1,N2=2,並且有Nh=Nh-1+Nh-2+1。可以證明,含有n個結點的平衡二叉樹跟屬於的最大深度爲O(log2n),因此平衡二叉樹的平均查找長度爲O(log2n),如圖35-7所示。

                                                圖35-7  結點個數n最少的平衡二叉樹

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章