專題:平衡二叉樹的旋轉


當平衡因子,即左子樹和右子樹高度的差>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向左

實際上就這么回事.考試要求知道原理和實現過程就行了.代碼以后再說吧.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM