清溪算法 2019-12-04
今天有同学问了我如何构造平衡二叉树,总结如下:
平衡因子 BF(balance factor)为该节点左子树高度 - 右子树高度,绝对值如果 ≤ 1,则二叉树不需要调整。
平衡二叉树构造过程比较简单,分为四种情况:
用实例解释一下四种情况的调整方案:
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 的右子树,是由于平衡二叉树节点的左子树都比节点小,右子树都比节点大的性质决定的。
对一棵平衡二叉树插入数据,平衡因子没有被破坏就不需要调整;如果调整后不是一个二叉平衡树,不满足其节点的左子树都比节点小,右子树都比节点大的性质就说明调整的过程出错了,需要排查算法的错误。