平衡二叉樹的插入旋轉

平衡二叉樹定義(AVL樹)

 平衡二叉樹是在二叉排序樹(BST)上引入的,就是爲了解決二叉排序樹的不平衡性,而不平衡性又是時間複雜度增大的主要原因。
 例如:數組a=[12,24,37,45,53,93]建立二叉排序樹爲下圖所示。左圖爲平衡二叉樹,右圖爲二叉排序樹。
 這裏寫圖片描述
圖1
由上圖可知,當你進行查找時,右圖的平均查找時間高於左圖。
所以AVL樹在查找方面性能就保持了BST的最好時間複雜度O(logn)。

平衡二叉樹或者是一顆空樹,或者具有以下性質的二叉樹:它的左子樹和右子樹的深度之差的絕對值不超過1,且它的左子樹和右子樹都是一顆平衡二叉樹。
在對樹進行旋轉操作時,我們需要了解幾點概念:
1.最小不平衡子樹:指離插入節點最近且以平衡因子的絕對值大於1的節點作爲根的子樹。
例如:
這裏寫圖片描述
圖2
左邊的圖是平衡二叉樹,但是當此時插入鍵爲20的節點,會形成右圖這種不平衡二叉樹。鍵爲80的左右子樹的深度之差爲2,所以80的左子樹就是最小不平衡子樹,而80就是最小不平衡子樹的根節點。
2.平衡因子(bf):結點的左子樹的深度減去右子樹的深度,那麼顯然-1<=bf<=1;
例如:圖2的左圖,節點80的左子樹深度爲3,右子樹深度爲1,所以左右子樹的深度差爲2。

插入操作:
在平衡二叉樹中插入結點與二叉查找樹最大的不同在於要隨時保證插入後整棵二叉樹是平衡的。那麼調整不平衡樹的基本方法就是: 旋轉,基本思路都是轉換到左旋和右旋。
(1)右旋:節點插入在最小不平衡節點的左子樹的左子樹上。此時以最小不平衡子樹的根節點爲旋轉節點,進行右旋。
這裏寫圖片描述
(2)左旋: 節點插入在最小不平衡節點的右子樹的右子樹上。此時以最小不平衡子樹的根節點爲旋轉節點,進行左旋。
這裏寫圖片描述
(3)右左:節點插入在最小不平衡節點的左子樹的右子樹上面。以最小不平衡節點進行右旋,再以最小不平衡子樹的根節點左旋。
這裏寫圖片描述
(4)左右:節點插入在最小不平衡節點的左子樹的右子樹上面。以最小不平衡節點進行左旋,再以最小不平衡子樹的根節點右旋。
這裏寫圖片描述
總結:
左旋:逆時針旋轉;旋轉節點的右節點代替自己位置,自己成爲右節點的左子節點,右節點的左子節點成爲旋轉節點的右子節點。
右旋:順時針旋轉;旋轉節點的左節點代替自己位置,自己成爲左節點的右子節點,左節點的右子節點成爲旋轉節點的左子節點。
參考博客:
平衡二叉樹的插入旋轉
數據結構—平衡二叉樹

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