算法 - 平衡二叉树

Posted chenxianbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法 - 平衡二叉树相关的知识,希望对你有一定的参考价值。

平衡二叉树

今天有同学问了我如何构造平衡二叉树,总结如下:

平衡因子 BF(balance factor)为该节点左子树高度 - 右子树高度,绝对值如果 ≤ 1,则二叉树不需要调整。

平衡二叉树构造过程比较简单,分为四种情况:

  • LL 插入
  • RR 插入
  • LR 插入
  • RL 插入

用实例解释一下四种情况的调整方案:

LL 插入:
可以计算得到 8 的 BF 为 2,受到破坏且是第一个发现的节点,
LL 表示破坏者处于被破坏者左子树(left)的左子树(left)中。

被破坏者             15
                  /    发现者           8      17
               /       
              4
             /
破坏者       1

此时需要发现者调整为:
被破坏者             15
                  /    发现者           4      17
               /      
              1    8
 
LR 插入:
可以计算得到 8 的 BF 为 2,受到破坏且是第一个发现的节点,
LR 表示破坏者处于被破坏者左子树(left)的右子树(right)中。
被破坏者             15
                  /    发现者           4      17
               /      
              1    8
                                        12

此时需要将                   调整为
                15            8
               /             /               4             4  15
                   
                8


                    8
                  /                   4     15
               /                      1          17

然后很重要的一步就是对 12 调整位置:
                    8
                  /                    4      15
               /      /                1      12   17

而其实 RR 插入是和 LL 插入的情况相似的,RL 插入和 LR 插入也是如此。其中 LR 插入这种类型比 LL 插入类型调整起来更为复杂,LL 也不是从发现者开始计算左右子树的,需要向上传递找到一系列受影响的节点,一般都是根节点出发的。

12 这个节点之所以放在 15 的左子树中而不是放在 4 的右子树,是由于平衡二叉树节点的左子树都比节点小,右子树都比节点大的性质决定的。

总结

对一棵平衡二叉树插入数据,平衡因子没有被破坏就不需要调整;如果调整后不是一个二叉平衡树,不满足其节点的左子树都比节点小,右子树都比节点大的性质就说明调整的过程出错了,需要排查算法的错误。

以上是关于算法 - 平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章

编程算法 - 推断二叉树是不是平衡树 代码(C)

算法总结:左神class5—二叉树是否是平衡二叉树,搜索二叉树,平衡二叉树

⭐算法入门⭐《二叉树 - 平衡二叉树》简单01 —— LeetCode 110. 平衡二叉树

算法笔记-7:平衡二叉树(代码篇)

代码随想录算法训练营第17天 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

算法平衡二叉树 Avl 树