My Gitee Link

二叉平衡树的手动简单调整

规定:

平衡二叉树均是左子树小于根节点,右子树大于根节点

在下方的示意图中:

1 米黄色圈表示教材上所说的最小不平衡子树

2 粉红的圈表示本文算法所提到的最小调整树

3 图中浅蓝色的数字代表每个结点此时的平衡因子

 

算法思路如下:

  • 标平衡因子:先对所有的结点标记出平衡因子(平衡因子 = 该结点左子树深度 - 该结点右子树深度)

  • 找最小调整树

    • 最小不平衡子树(教材概念):以插入路径上离插入结点最近的平衡因子的绝对值大于 1 的结点作为根的子树

    • 最小调整树(本文算法):此处所说的最小调整树(本文算法规定只包含 3 个结点)与教材上有一点区别,需要分情况:

      • 情况一:最小不平衡子树中包含根节点时,最小调整树不包含刚插入的叶子节点

      • 情况二:最小不平衡子树中不包含根节点时,最小调整树包含刚插入的叶子结点

  • 根据平衡因子调整结点位置

    • 结点命名规定

      • 调整前:最小调整树永远只有 3 结点,并且一定处于不同的 3 层,从上到下依次命名为 A、B、C

      • 调整时:平衡因子最大的叫 Max,最小的叫 Min,大小处于两者中间的叫 temp;若两个结点的平衡因子刚好相等,则将最下面的 C 作为 temp,中间的 B 作为 Max

    • 调整原则:将结点 temp 及其所拥有的所有子树一起插入到 Min 和 Max 中间

    • 调整时针对 “找最小调整树” 步骤  中提到的两种情况,分别有不同的调整策略

      • 最小调整树 中 包含根节点 

        • temp 结点带着它的子树一起向上移动,temp 结点插入到结点 Min 和 Max 中间

        • 当 temp 结点有左子树时,将 temp 的左子树连接在 Min 结点上

        • 当 temp 结点有右子树时,将 temp 的右子树连接在 Max 结点上

        • 最后,将 temp 结点作为新的根节点,捏住 temp 结点向上提,得到一棵新的树

        • 调整完毕

      • 最小调整树 中 不包含根节点 

        • 将最小调整树从原树上断开,单独进行调整

        • 断开后,根据调整原则将 temp 结点插入到 Min 和 Max 的中间

        • 捏住结点 temp 向上提,形成新子树,将该新子树连接到原树中刚刚断开的地方

        • 调整完毕

 

【例】将关键字序列 {34,23,15,98,115,28,107} 插入到一颗空的平衡二叉排序树中,要求得到的树所有子树仍然满足平衡二叉排序树的性质

 

 

posted @ 2021-03-25 22:10  笨草戆沐  阅读(338)  评论(0)    收藏  举报