第一次平衡树 - noob问题

时间:2012-08-18 14:57:40

标签: algorithm tree binary-tree

我开始研究如何在采访中平衡树木,我有一些问题

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

我读过关于旋转,重量的东西,但我现在有点困惑

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

答案 1 :(得分:2)

  

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

O(n)中,您可以使用in-order traversal中的元素构建一个完整的树,然后填充

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

  

我是否必须使用AVL或红黑树来获取   平衡的树?

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

  

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

我发现AVL treeRed-Black tree上的维基百科文章非常有用。如果你有特定的东西你不明白 - 你应该问。

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