专题:平衡二叉树的旋转

当平衡因子,即左子树和右子树高度的差>1时,就出现了不平行,需要进行旋转。下面是几种不平衡的情况和对应的处理方式:

See AVL-平衡二叉树的原理和实现 - 超级小小黑 - 博客园 (cnblogs.com)

img

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)旋转到平衡

然后把多出来的节点T2T3重新插入.

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).要做旋转,

  1. 先对左子树做RR向左旋转,变成了典型的LL旋转
  2. 再对整体做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向左

实际上就这么回事.考试要求知道原理和实现过程就行了.代码以后再说吧.

posted @ 2021-11-09 15:57  IRIDIUM-SUB  阅读(324)  评论(0编辑  收藏  举报