平衡二叉樹(樹的旋轉)
1.概念
平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度儘可能小,因此,樹中每個結點的兩棵子樹的深度不要偏差太大。
平衡二叉樹的遞迴定義:平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下2個性質:①左右子樹深度之差的絕對值不大於1。②左右子樹都是平衡二叉樹。
平衡因子的概念:結點的平衡因子 = 結點的左子樹深度 — 結點的右子樹深度。若平衡因子的取值為-1、0或1時,該節點是平衡的,否則是不平衡的。
最低不平衡結點的概念:用A表示最低不平衡結點,則A的祖先結點可能有不平衡的,但其所有後代結點都是平衡的。
2.平衡化的實現
整個實現過程是通過在一棵平衡二叉樹中依次插入元素(按照二叉排序樹的方式),若出現不平衡,則要根據新插入的結點與最低不平衡結點的位置關係進行相應的調整。分為LL型、RR型、LR型和RL型4種類型,各調整方法如下(下面用A表示最低不平衡結點
(1)LL型調整:
由於在A的左孩子(L)的左子樹(L)上插入新結點,使原來平衡二叉樹變得不平衡,此時A的平衡因子由1增至2。下面圖1是LL型的最簡單形式。顯然,按照大小關係,結點B應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡,A結點就好像是繞結點B順時針旋轉一樣。
圖1 最簡單的LL型調整
LL型調整的一般形式如下圖2所示,表示在A的左孩子B的左子樹BL(不一定為空)中插入結點(圖中陰影部分所示)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將A的左孩子B提升為新的根結點;②將原來的根結點A降為B的右孩子;③各子樹按大小關係連線(BL和AR不變,BR調整為A的左子樹)。
圖2 一般形式的LL型調整
(2)RR型調整:
由於在A的右孩子(R)的右子樹(R)上插入新結點,使原來平衡二叉樹變得不平衡,此時A的平衡因子由-1變為-2。圖3是RR型的最簡單形式。顯然,按照大小關係,結點B應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡,A結點就好像是繞結點B逆時針旋轉一樣。
圖3 最簡單的RR型調整
RR型調整的一般形式如下圖4所示,表示在A的右孩子B的右子樹BR(不一定為空)中插入結點(圖中陰影部分所示)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將A的右孩子B提升為新的根結點;②將原來的根結點A降為B的左孩子;③各子樹按大小關係連線(AL和BR不變,BL
圖4 一般形式的RR型調整
(3)LR型調整:
由於在A的左孩子(L)的右子樹(R)上插入新結點,使原來平衡二叉樹變得不平衡,此時A的平衡因子由1變為2。圖5是LR型的最簡單形式。顯然,按照大小關係,結點C應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡。
圖5 最簡單的LR型調整
LR型調整的一般形式如下圖6所示,表示在A的左孩子B的右子樹(根結點為C,不一定為空)中插入結點(圖中兩個陰影部分之一)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將C的右孩子B提升為新的根結點;②將原來的根結點A降為C的右孩子;③各子樹按大小關係連線(BL和AR不變,CL和CR分別調整為B的右子樹和A的左子樹)。
圖6 一般形式的LR型調整
(4)RL型調整:
由於在A的右孩子(R)的左子樹(L)上插入新結點,使原來平衡二叉樹變得不平衡,此時A的平衡因子由-1變為-2。圖7是RL型的最簡單形式。顯然,按照大小關係,結點C應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡。
圖7 最簡單的RL型調整
RL型調整的一般形式如下圖8所示,表示在A的右孩子B的左子樹(根結點為C,不一定為空)中插入結點(圖中兩個陰影部分之一)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將C的右孩子B提升為新的根結點;②將原來的根結點A降為C的左孩子;③各子樹按大小關係連線(AL和BR不變,CL和CR分別調整為A的右子樹和B的左子樹)。
圖8 一般形式的RL型調整
平衡二叉樹的深度接近log2n的數量級,從而保證在二叉排序樹上插入、刪除和查詢等操作的平均時間複雜度為O(log2n)。
例項
此處附上一張自己理解過程的圖。
其中,對於第10步插入18後,為什麼要進行調整,剛開始理解有偏差,還疑惑了好一陣。後來才發現,自己對平衡因子的理解出錯了。
找平衡因子,平衡因子看哪個值先為-2(哪個根左右子樹或子樹高度差超過1,這個根的平衡因子就為-2,並且如果有兩個平衡因子-2的,旋轉那個靠近插入值那邊的那個根)
如圖所示,節點16的平衡因子為-2,產生了不平衡,因此從16開始調整(旋轉),執行RL調整。