【问题标题】:First time balancing trees - noob questions第一次平衡树 - 菜鸟问题
【发布时间】:2012-08-18 14:57:39
【问题描述】:

我开始研究如何平衡树木进行面试,我有一些问题

  • 是否可以平衡正常的二叉树?如果是,应该使用哪种算法?
  • 我是否必须使用 AVL 或红黑树才能获得平衡树?这些是如何工作的?您能否提供尽可能简单地解释这些内容的链接?

我读过一些关于旋转、重量的文章,但我现在有点困惑

【问题讨论】:

  • Is it possible to balance a normal binary tree:在O(n) 中,您可以构建一棵完整的树,并用按顺序遍历的元素填充它。这样的答案是你要找的吗?

标签: algorithm tree binary-tree


【解决方案1】:

嗯... AVL 和红黑树是平衡的“正常二叉树”,并保持这种平衡(对于“平衡”的某些定义)。我不是计算机科学老师,无法对算法提出自己的解释,我猜你不是在寻找维基百科的剪切和粘贴:-)

现在,对于平衡二叉树:如果树是搜索树(即“排序”,但如果不是,则“平衡”并没有多大意义)你总是可以重新创建树。最简单的算法是使用一个数组,其中包含树中的所有元素,按排序顺序(很容易从中序遍历中获得)。然后围绕这个总体思路构建算法:

  • 将数组的中间元素作为树的根。这将创建一个树节点,以及两个数组“left”和“right”,用于形成左右子树
  • 递归地应用相同的算法从“左”数组和“右”数组创建一棵树。这两棵树成为父节点的子节点。

当数组有偶数个元素时,您可能需要小心:没有明显的“中间元素”,删除两个候选者之一将创建不同大小的数组。我懒得进一步分析这是否可以抵消整个平衡的事情。

当然,每次更改树时都做这样的事情并不是一个好主意。你真的想为此使用像 AVL 这样的自平衡树。在创建树之后执行它也可能不是那么有用:您可以只使用数组本身并对其进行二进制搜索,而不是创建树。数组只是二叉树的另一种形式...

编辑:许多计算机科学家花费大量时间开发在某些情况下表现良好的数据结构和算法是有原因的。滚动你自己的平衡二叉树版本不太可能击败这些......

【讨论】:

    【解决方案2】:

    是否可以平衡正常的二叉树?如果是,哪个 应该使用算法吗?

    O(n) 中,您可以构建一棵完整的树,并用in-order traversal 中的元素填充它

    它不能做得更好,因为 BST 在极少数情况下可能会衰减为链(链表),其中所有节点都有一个子节点为空。在这种情况下,访问中间的元素是O(n) 本身。

    我是否必须使用 AVL 或红黑树才能获得 平衡树?

    还有其他平衡树,例如B+ trees,以及其他数据结构(不是树),例如skip-lists。您可能想查看已知 data structures 的列表,尤其是 trees section

    这些是如何工作的?你能提供简单解释这些的链接吗 尽可能?

    我发现AVL treeRed-Black tree 上的维基百科文章内容丰富。如果你有一些具体的地方你不明白 - 你应该问。

    另外:尝试自己实现平衡树(实现已知的树,而不是发明新的树 - 当然) - 非常适合教育目的,这样做 - 你会肯定会明白它是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多