注意事项:以下内容用到大量的代号,建议一边画图,一边推导
假设,左子树高度为LH,右子树高度为RH,左孩子的左子树高度为LLH,左孩子的右子树高度为LRH,右孩子的左子树高度为RLH,右孩子的右子树高度为RRH,旋转后左子树高度为NLH,旋转后右子树高度为NRH
1. LL与RR
以LL情况为例,可知:
LH = RH + 2
LH = max(LLH, LRH) + 1 = LLH + 1
RH = LLH - 1
LRH + 1 <= LLH <= LRH + 2
以左孩子为轴,进行右旋后
NLH = LH - 1
NRH = max(LRH, RH) + 1
则新的平衡树的左右高度差为
|NLH - NRH| = |(LH - 1) - (max(LRH, RH) + 1)|
= |LLH - (max(LRH, LLH - 1) + 1)|
= |max(LLH - LRH - 1, LLH - LLH)|
= |max(LLH - LRH - 1, 0)|
化简可得
0 <= |NLH - NRH| <= 1
满足平衡二叉树的定义,同理可证RR
2. LR与RL
以LR情况为例,可知:
LH = RH + 2
LH = max(LLH, LRH) + 1 = LRH + 1
RH = LRH - 1
LLH + 1 <= LRH <= LLH + 2
|LRLH - LRRH| = 1
LRH = max(LRLH, LRRH) + 1
以左孩子的右孩子为轴,进行左旋后
NLLH = max(LLH, LRLH) + 1
NLRH = LRRH
则左孩子的左右高度差为
|NLLH - NLRH| = |max(LLH, LRLH) + 1 - LRRH|
= |max(LLH - LRRH + 1, LRLH - LRRH + 1)|
若LRLH > LRRH,则:
LLH <= LRRH <= LLH + 1
LRLH = LRRH + 1
LRH = LRLH + 1
计算得
|NLLH - NLRH| = 2
再以左孩子为轴,进行一次右旋
|NLH - NRH| = |(max(LLH, LRLH) + 1) - (max(LRRH, RH) + 1)|
= |max(LLH, LRLH) - max(LRRH, RH)|
= |LRLH - LRLH|
= 0
满足平衡二叉树的定义,同理可证RL
3. 参考文献
(1)An algorithm for the organization of information
(3)可视化AVL