当平衡因子,即左子树和右子树高度的差>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向左
实际上就这么回事.考试要求知道原理和实现过程就行了.代码以后再说吧.