平衡二叉樹 左旋和右旋思路


二叉平衡樹:

 

平衡二叉搜索樹(Self-balancing binary search tree)又被稱為AVL樹(有別於AVL算法),且具有以下性質:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。平衡二叉樹的常用實現方法有紅黑樹AVL替罪羊樹Treap伸展樹等。 最小二叉平衡樹的節點總數的公式如下 F(n)=F(n-1)+F(n-2)+1 這個類似於一個遞歸的數列,可以參考Fibonacci(斐波那契)數列,1是根節點,F(n-1)是左子樹的節點數量,F(n-2)是右子樹的節點數量。

二叉平衡樹的左子結點和右子結點 相差不能超過1(可以是0 or 1)

 

左旋:

 

A

  B

        C

在這個樹中  c的結點高度為1  b的結點高度為2  a的結點高度為3

 

根據二叉平衡樹的定義  可以知道此時樹不平衡  

 

如何把樹平衡:

 

當右結點高度大於左結點高度時

 

想要把樹平衡需要這樣:

   B

A     C

 

此時可以看到A旋轉到了下方

此為樹的左旋

更多的情況:

 

ROOT

      A

   D      B

        E    C

 

ROOT的左結點高度為0   右結點高度為3

此時結點高度大於1

此時左旋后 樹應該是:

 

ROOT

      B

   A     C

D    E       

旋轉前e結點一定比a結點要大  所以 旋轉后 a的右結點應該改為 b的左結點(e)

b結點放入a結點的位置 a結點成為b結點的左結點

 

 

 

右旋:

 

     A

   B

 C

此時c結點高度為1  b2  a3 樹不平衡

若要平衡則需要右旋:

        B

 C     A

 

更多的情況

    ROOT

      A

              B     D

           C   E

此時樹不平衡 若需平衡需要右旋

         ROOT

        B

           C     A

                 E      D

 

幺蛾子:

     ROOT

              A

        B          D   

           E

左孩子大於有孩子時

此時 b的左孩子比右孩子高  此時先左旋b 在右旋a

    

     ROOT

          A

      D       B

             C

右孩子大於左孩子時

此時 b的左孩子比右孩子高  此時先右旋b 在左旋a

 


免責聲明!

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



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