1. 程式人生 > >平衡二叉樹的插入和旋轉

平衡二叉樹的插入和旋轉

平衡二叉樹定義(AVL):它或者是一顆空樹,或者具有以下性質的二叉樹:它的左子樹和右子樹的深度之差的絕對值不超過1,且它的左子樹和右子樹都是一顆平衡二叉樹。

 //關於樹的一些概念上的糾正:

1.樹的深度是從根節點開始(其深度為1)自頂向下逐層累加的,而高度是從葉節點開始(其高度為1)自底向上逐層累加的。
2.雖然樹的深度和高度一樣,但是具體到樹的某個節點,其深度和高度是不一樣的。
3.我的理解是:非根非葉結點的深度是從根節點數到它的,高度是從葉節點數到它的
 /*也就是說:從下往上叫高,上往下叫深*/

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

特點:給定結點數為N的AVL樹的最大高度為log2N

最小不平衡子樹:指離插入節點最近且以平衡因子的絕對值大於1的節點作為根的子樹。 

平衡因子(bf):結點的左子樹的深度減去右子樹的深度,|bf|<=1;

插入操作:(在平衡二叉樹的基礎上進行插入操作,二叉樹實時為平衡二叉樹)

1) 左單旋(LL旋轉): 在最小平衡子樹根節點平衡因子>=2且在根節點的左孩子的左孩子插入元素,進行左旋(圖片中“右旋”->“左旋”):

 注:70為不平衡的發現者,20為麻煩結點(在發現者左子樹的左子樹)

2)右單旋(RR旋轉): 在最小平衡子樹根節點平衡因子>=-2且在根節點的右孩子的右孩子插入元素,進行右旋(圖中“左旋”->“右旋”):

  注:100為不平衡的發現者,140為麻煩結點(在發現者右子樹的右子樹)

3) 右左:最小平衡子樹根節點(80)的右孩子(100)的左孩子(90)的子節點(95)插入新元素,先繞根節點的右孩子節點(100)右旋,再圍根節點(80)左旋:

4)左右:基本同上!!

有什麼問題可以共同探討哈,謝謝!