平衡二叉树(AVL)

时间:2008-09-25 14:18:19

标签: algorithm computer-science binary-tree theory avl-tree

好的,这是CS家伙理论领域的另一个。

在90年代,我在实施BST方面做得相当不错。我唯一无法理解的是算法的复杂性以平衡二叉树(AVL)。

你能帮助我吗?

7 个答案:

答案 0 :(得分:16)

我认为在这里发布节点平衡算法的完整代码并不好,因为它们变得非常大。但是,关于red-black trees的维基百科文章包含了该算法的完整C实现,而AVL trees上的文章也提供了一些指向高质量实现的链接。

这两种实现对于大多数通用场景都足够了。

答案 1 :(得分:15)

替罪羊树可能有最简单的平衡确定算法来理解。如果任何插入导致新节点太深,它会通过查看权重平衡而不是高度平衡来找到要重新平衡的节点。是否在删除时重新平衡的规则也很简单。它不会在节点中存储任何神秘信息。证明它是正确的更难,但是你不需要理解算法...

然而,与AVL不同,它始终不是高度平衡的。像红黑一样,它的不平衡是有界的,但与红黑不同,它可以通过参数进行调节,因此对于大多数实际用途来说,它看起来像你需要的那样平衡。我怀疑,如果你把它调得太紧,那么最坏情况下插入的结果会比AVL差或坏。

对问题编辑的回复

我将提供理解AVL树的个人途径。

首先,您必须了解树旋转的内容,因此请忽略您从未听过AVL算法的所有内容并理解它。直接在你的头部,这是一个正确的旋转,这是一个左旋转,每个人对树做什么,否则精确方法的描述会让你感到困惑。

接下来,要了解平衡AVL树的技巧是每个节点在其中记录其左右子树的高度之间的差异。 “高度平衡”的定义是,对于树中的每个节点,它介于-1和1之间。

接下来,请了解如果添加或删除了某个节点,则可能会使该树失去平衡。但是,您只能更改节点的平衡,这些节点是您添加或删除的节点的祖先。所以,你要做的就是回到树上,使用旋转来平衡你找到的任何不平衡节点,并更新它们的平衡分数,直到树再次平衡。

理解它的最后一部分是在一个不错的参考中查找用于重新平衡你找到的每个节点的特定旋转:这是它的“技术”而不是高概念。您只需在修改AVL树代码时或在数据结构检查期间记住细节。自从我上次使用AVL树代码以及在调试器中打开以来已经很多年了 - 实现往往会达到他们工作的程度,然后继续工作。所以我真的不记得了。你可以使用一些扑克筹码在桌面上进行练习,但很难确定你真的得到了所有的情况(没有很多)。最好只是查找它。

然后就是把它全部翻译成代码的业务。

我不认为查看代码清单对除了最后一个阶段之外的任何阶段都有帮助,所以忽略它们。即使在最好的情况下,代码清楚地写入,它看起来像过程的教科书描述,但没有图表。在一个更典型的情况下,它是一个混乱的C结构操作。所以只要坚持书。

答案 2 :(得分:4)

我最近一直在用AVL树做一些工作。

我能找到的关于如何平衡它们的最佳帮助是通过搜索谷歌。

我刚刚编写了这个伪代码(如果你理解如何进行旋转,那么很容易实现)。

IF tree is right heavy
{
  IF tree's right subtree is left heavy
  {
     Perform Double Left rotation 
  }
  ELSE
  {
     Perform Single Left rotation
  }
}
ELSE IF tree is left heavy
{
  IF tree's left subtree is right heavy
  {
     Perform Double Right rotation
  }
  ELSE
  {
     Perform Single Right rotation
  }
}

答案 3 :(得分:1)

我同意,完整的程序是不合适的。

虽然经典AVL和RB树使用确定性方法,但我建议看一下“Randomized binary search trees”,这种方法保持平衡成本较低,并且无论密钥的统计分布如何都能保证良好的平衡。 / p>

答案 4 :(得分:0)

AVL树效率低下,因为每次插入/删除都需要进行多次旋转。

红黑树可能是更好的选择,因为插入/删除更有效。这种结构保证了叶子的最长路径不超过最短路径的两倍。因此,虽然不如AVL树平衡,但是避免了最糟糕的不平衡情况。

如果您的树将被多次读取,并且在创建后不会被更改,那么完全平衡的AVL树可能需要额外的开销。此外,红黑树需要为每个节点提供一个额外的存储空间,从而为节点提供“颜色”。

答案 5 :(得分:0)

为了平衡AVL树,我刚写了一堆函数,我想在这里与大家分享。我想这个实现是完美无缺的。当然欢迎查询/问题/批评:

http://uploading.com/files/5883f1c7/AVL_Balance.cpp/

作为Stackoverflow的新手,我尝试在此处发布我的代码,但却遇到了错误的格式问题。所以,将文件上传到上面的链接。

干杯。

答案 6 :(得分:0)

自我平衡avl树@ http://code.google.com/p/self-balancing-avl-tree/的完整实现。它还实现了对数时间连接和拆分操作以及地图/多图集合