剛開始聽這個平衡二叉樹的旋轉,一聽就蒙了,后來看了很多視頻,有很多的說法。下面來介紹平衡二叉樹
平衡二叉樹:就是每個節點的平衡因子(Balance Factor)(以下簡稱BF)的絕對值小於等於1,即為0或1。
而BF就是每個節點左子樹的高度減去右子樹的高度。
平衡二叉樹的旋轉共有四種情況:
下面說一個定義,新插入的節點為破壞點,而由於破壞點的存在使二叉樹失衡(|BF|>1)的節點為被破壞節點
1.LL型:即為被破壞節點的左子樹的左子樹插入破壞節點。如圖:

數值為10的節點的左子樹(數值為9的節點)的左子樹(數值為8的節點),使其不平衡,而10為被破壞節點,8為破壞節點,那么LL即為10的L的9的L,后一個L為中心,順時針旋轉10節點(右旋),則得到:

RR型:即為被破壞節點的右子樹的右子樹插入破壞節點。如圖

數值為10的節點的右子樹(數值為11的節點)的右子樹(數值為12的節點),使其不平衡,而10為被破壞節點,12為破壞節點,那么RR即為10的R的11的R,后一個R為中心,逆時針旋轉10節點(左旋),則得到:

LR型:即為被破壞節點的左子樹的右子樹插入破壞節點。如圖:

無論怎么旋轉發現一次都不能完成,則需先將其轉化為LL型(因為LR型第一個為L,所以轉化為LL型,再按上面的步驟進行旋轉),又因為LL為遞減的順序,所以6應該上去,5下來;
1.轉化為LL型:

這樣就構成了LL型,按上面的步驟進行二次旋轉
2.按LL型處理:

RL型:即為被破壞節點的右子樹的左子樹插入破壞節點。如圖:

先將其轉化為RR型,因為RR型,從上往下為遞增,因此需要將11向上,12向下,從而構造成,RR型;
1.轉化為RR型

2.正常的RR旋轉:

注意:考試的題,二叉樹會很復雜,也就是說你要正確的LR,RR,LL,RL對於哪個節點而言,這樣你就會明白旋轉的中心
旋轉的操作都是對不平衡的最小子樹,例如如果兩個節點都不平衡,則先考慮深度大的節點,因為解決這個問題以后,可能深度小的也自然而然的解決了。
要解決旋轉之后產生分支的何去何從,這是你要看分支在原圖的位置,和其他點的大小關系,這樣你就知道旋轉之后,它要依附於哪個點
不管怎么操作都不能改變其中序遍歷的順序
認真的思考之后,不難發現,不論用什么方法,操作以后,都是讓是三個點之中大小為中間的數做根,比中間數小的數,做根的左孩子,比中間數大的數,做根的右孩子,因此有一個簡單的方法:
1.不管什么結構,從最深的葉子節點向上遞歸查找第一個失衡的點,標號為1.
2.再選1下面的點為2.
3.再選2下面的點為3.
4.不管什么結構,大小為中間的數做根,比中間數小的數,做根的左孩子,比中間數大的數,做根的右孩子
5.然后按照分支和每個點之間的關系,補全,這樣就完成了。
例子:在如圖所示的平衡二叉樹中插入關鍵字48后得到一顆新的平衡二叉樹,在新的平衡二叉樹中,關鍵字37所在的節點的左右子節點中保存的關鍵字分別是:

插入48之后如圖:

從下到上計算每個節點的BF;
BF(48)=0; BF(37)=-1; BF(90)=0; BF(53)=1; BF(13)=0; BF(24)=-2;
發現失衡節點為24,那么24編號為1,又因為插入了48(所以造成失衡的路徑應為24->53->37->48),所以2號節點為53,3號節點為37
將三個節點排序,則37為根節點,24為左孩子,53為右孩子,如圖:

再按原圖的關系,補全圖:53右孩子為90;49比37大比53小,所以48為53的右孩子;24的左孩子為13;如圖:

可知答案為24 53;
