zoukankan      html  css  js  c++  java
  • 平衡二叉树 左旋和右旋思路

    二叉平衡树:

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

    学如逆水行舟,不进则退。 博客园技术交流群 群 号:1073255314 (本群没人,刚刚建立 -_-!!! )
  • 相关阅读:
    JS 里的数据类型转换
    mysql-5.7.25解压版本安装和navicat 12.1版本破解-4.8破解工具
    idea如何打包项目(java)
    idea如何使用git
    staruml百度网盘下载
    IDEA如何添加库lib(java)
    Win10下JDK环境搭建的两种方法
    HashMap的四种遍历!
    (转)排序算法之插入排序
    (转)排序算法之快速排序
  • 原文地址:https://www.cnblogs.com/Mj-NaijAm/p/13606602.html
Copyright © 2011-2022 走看看