保持avl树平衡而不旋转

时间:2015-02-23 18:26:02

标签: algorithm data-structures b-tree avl-tree tree-balancing

B树是像AVL树一样的自平衡树。 HERE我们可以看到左右旋转是如何用来保持AVL树平衡的。

HERE是解释B树插入的链接。这种插入技术不涉及任何旋转,如果我没有错,保持树平衡。因此它看起来更简单。

问题:是否有任何类似(或任何其他不使用旋转的技术)来保持avl树平衡?

1 个答案:

答案 0 :(得分:3)

答案是......是和否。

B树不需要进行轮换,因为他们可以将多少不同的密钥打包到节点中。当您将越来越多的密钥添加到B树中时,可以通过将这些密钥吸收到节点本身来避免树变得不平衡。

二元树没有这种奢侈品。如果将密钥插入二叉树中,则在所有情况下,该树中某个分支的高度将增加1,因为该密钥需要进入其自己的节点。旋转通过确保如果某些树枝长得太多,将高度拖入树的其余部分来对抗树木的整体生长。

大多数平衡的BST都有某种涉及轮换的再平衡策略,但并非所有人都这样做。一个不直接涉及旋转的策略的一个值得注意的例子是scapegoat tree,它通过从主树中撕下巨大的子树,最佳地重建它们,然后将子树粘合回主树来重新平衡。这种方法在技术上不涉及任何轮换,并且是实现平衡树的一种非常干净的方法。

那就是说 - 替罪羊树的最节省空间的实现确实使用旋转将不平衡树转换成完美平衡的树。你没有 使用旋转来执行此操作,但如果空间很短,那么这可能是最好的方法。

希望这有帮助!