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

二叉平衡树:

 

平衡二叉搜索树(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

 

posted @ 2020-09-03 11:22  特权E5  阅读(1289)  评论(0编辑  收藏  举报