當平衡因子,即左子樹和右子樹高度的差>1時,就出現了不平行,需要進行旋轉。下面是幾種不平衡的情況和對應的處理方式:
See AVL-平衡二叉樹的原理和實現 - 超級小小黑 - 博客園 (cnblogs.com)
LL旋轉
造成不平衡的節點插在了左子樹的左孩子上。
///////////////////////////////////////////////////
// LL T1<Z<T2< X <T3<Y<T4 //
// y x //
// / \ / \ //
// x T4 向右旋轉 (y) z y //
// / \ - - - - - - - -> / \ / \ //
// z T3 T1 T2 T3 T4 //
// / \ //
// T1 T2 //
///////////////////////////////////////////////////
考慮上述的樹,其中x,y,z是節點,T是虛擬節點.解決方法就是把外層鏈(T1-Z-X-Y-T4
)旋轉到平衡
然后把多出來的節點T2
和T3
重新插入.
Y>X>T2>Z
AND Y>T3>X
就插到那里去了.
這是一種急救方法,代碼實現肯定不是這樣的.
RR旋轉
////////////////////////////////////////////////
// RR T1<Y<T2< X <T3<Z<T4 //
// y x //
// / \ / \ //
// T1 x 向左旋轉 (y) y z //
// / \ - - - - - - - -> / \ / \ //
// T2 z T1 T2 T3 T4 //
// / \ //
// T3 T4 //
////////////////////////////////////////////////
造成不平衡的點插在了右子樹的右節點上(Z
).
於是外層向左旋轉平衡,T2和T3重新插入.同LL
LR旋轉
//////////////////////////////////////////////////////////////////////////////////////////
// LR T1<X<T2< Z <T3<Y<T4 //
// y y z //
// / \ / \ / \ //
// x t4 向左旋轉(x) z T4 向右旋轉(y) x y //
// / \ ---------------> / \ ---------------> / \ / \ //
// T1 z x T3 T1 T2 T3 T4 //
// / \ / \ //
// T2 T3 T1 T2 //
//////////////////////////////////////////////////////////////////////////////////////////
造成不平衡的節點插在了左子樹的右孩子上(Z
).要做旋轉,
- 先對左子樹做RR向左旋轉,變成了典型的LL旋轉
- 再對整體做LL向右旋轉
LR旋轉實際上就是先RR再LL的過程.
Exp:盡管y的左子樹沒有不平衡(平衡因子=-1),但樹y的平衡因子=1,方向不一樣.所以要先把子樹掰到和總體樹一樣,再按照LL或者RR調整.
RL旋轉
//////////////////////////////////////////////////////////////////////////////////////////
// RL: T1<Y<T2< Z <T3<X<T4 //
// y y z //
// / \ / \ / \ //
// T1 x 向右旋轉(x) T1 z 向左旋轉(y) y x //
// / \ - - - - - - -> / \ - - - - - - - - -> / \ / \ //
// z T4 T2 x T1 T2 T3 T4 //
// / \ / \ //
// T2 T3 T3 T4 //
//////////////////////////////////////////////////////////////////////////////////////////
造成根不平衡的節點插在了右子樹的左節點上.
同LR.先LL向右再RR向左
實際上就這么回事.考試要求知道原理和實現過程就行了.代碼以后再說吧.