【问题标题】:Can this binary tree be balanced?这棵二叉树可以平衡吗?
【发布时间】:2017-06-16 07:16:55
【问题描述】:

我曾尝试实现代码来实现平衡二叉搜索树的方式(蛮力),我发现(树的)有一个案例,似乎无法平衡。这棵树是

         6
          \
           10
          /
         8
        / \
       7   9

你可以很明显的发现这棵树的右边高度比它左边的高度大很多,所以我把树向左旋转'6'左右,那么新的树就会是

       10
      /
     6
      \
       8
      / \
     7   9

然后左边的高度远大于右边的高度,所以下一步我必须围绕节点'10'向右旋转(回到)树。

在平衡这棵树的同时,似乎必须有一个无限循环来围绕它的根节点旋转这棵树(向左、向右、向左、向右……等等)。有没有办法平衡这棵树?

【问题讨论】:

  • 查看最大堆或最小堆。这可能会帮助您了解如何创建平衡的二叉树。

标签: binary-tree


【解决方案1】:

您不应该先围绕根旋转,而应该先旋转右子树,因为它也是不平衡的。

这个

       10
      /
     8
    / \
   7   9

应该旋转并转换为

     8
    / \
   7   10
      /
     9

那么这棵树就是

   6
    \
     8
    / \
   7   10
      /
     9

然后你围绕根旋转

    8
   / \
  6   10
   \   /
    7 9

【讨论】:

  • 非常感谢!!!我发现我好尴尬!!这是一个很好的解释!
  • Sorry Jerry,我遇到了另一个二叉搜索树,1 -> 3 -> 2,我试图平衡这棵树(它实际上是一个子树),但它卡在了一个循环中。是否可以平衡二叉搜索树?
  • @DavidHsu,这是一种情况,您需要先旋转 3->2,然后将 2 放到根(双旋转)。我建议您阅读一些教科书,了解自平衡二叉搜索树的一些标准实现。一种常见的实现是 AVL 树,您可以参考这里的维基页面en.wikipedia.org/wiki/AVL_tree。双旋转案例正是您在这里遇到的。
  • 非常感谢,我会从书籍或网站上阅读更多关于 AVL 树的信息。
【解决方案2】:

最简单的算法是:

  1. 在此树中获取 3 个连续节点(在您的情况下为 6、8、10)
  2. 对这些节点排序
  3. 依次附加原始子树:空、7、9、空

这将产生:

     8
   /   \
  6     10
 / \   /  \
.   7 9    .

这棵树很平衡。

【讨论】:

  • 非常感谢!!!我发现我好尴尬!!这是一个很好的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2018-08-30
相关资源
最近更新 更多