1. 程式人生 > >平衡二叉樹(AVL樹,AVL樹旋轉)

平衡二叉樹(AVL樹,AVL樹旋轉)

1、平衡因子(BF):BF = HL - HR(其中HL和HR分別是左子樹和右子樹的高度)。

2、平衡二叉樹(AVL樹):對於任一結點,左右子樹的高度差的絕對值是小於1。 即 |BF|<=1。

例:1、
這裡寫圖片描述
對於3這個結點來講,左子樹高度為2,右子樹高度為0,左右子樹高度差為2,2>1,所以該樹不是平衡二叉樹。

2、
這裡寫圖片描述
對於這個樹裡面的每一個結點來講,左右子樹的高度差都小於等於1,所以該樹是平衡二叉樹 。

3、高度為h的平衡二叉樹的最小結點數:N(h) = N(h-1)+N(h-2)+1 。其中N(h-1) 和N(h-2)分別是高度為(h-1)和高度為(h-2)的最小結點數。可以推匯出——給定結點數為 n的AVL樹的最大高度為O(log2n)!

4、平衡二叉樹的調整:
(1)、右單旋:不平衡的“發現者”是Mar,“麻煩結點”Nov 在“發現者”右子樹的右邊,因而叫 RR 插入,需要RR 旋轉(右單旋)
這裡寫圖片描述
這裡寫圖片描述這裡寫圖片描述
!!!這種也叫作在“發現者”(被破壞者)的右子樹的右子樹上

一般調整情況:
這裡寫圖片描述
注意:調整過後還是要保證是一顆搜尋樹,即左子樹的值小於右子樹的值。

(2)、左單旋:“發現者”是Mar,“麻煩結點”Apr 在發現者左子的左邊,因而叫 LL 插入,需要LL 旋轉(左單旋)
這裡寫圖片描述
!!!這裡存在兩個被破壞者,但是隻調整了離破壞者最近的結點,這樣調整後整顆樹也是平衡二叉樹了。

一般調整情況:
這裡寫圖片描述

(3)、LR旋轉:“發現者”是May,“麻煩結點”Jan在左子樹的邊,因而叫 LR 插入,需要LR 旋轉
這裡寫圖片描述

一般調整情況:
這裡寫圖片描述

(4)、RL旋轉:插入的結點在被破壞者的右子樹的左子樹上。
這裡寫圖片描述

一般的調整情況:
這裡寫圖片描述

關於二叉平衡樹的實現將在後面補充。