And*_*897 2 algorithm b-tree avl-tree data-structures tree-balancing
B树与AVL树一样是自平衡树。在这里我们可以看到如何使用左右旋转来保持 AVL 树平衡。
这里是一个解释 B 树插入的链接。如果我没记错的话,这种插入技术不涉及任何旋转来保持树平衡。因此它看起来更简单。
问题:是否有任何类似的(或任何其他不使用旋转的技术)来保持 avl 树平衡?
答案是……是和否。
B 树不需要执行旋转,因为它们在可以将多少个不同的键打包到一个节点中方面有一定的余量。当您将越来越多的键添加到 B 树中时,您可以通过将这些键吸收到节点本身中来避免树变得不平衡。
二叉树没有这种奢侈。如果将一个键插入二叉树,则在所有情况下都会将该树中某些分支的高度增加 1,因为该键需要进入其自己的节点。旋转通过确保如果某些分支生长过多,则该高度会被转移到树的其余部分中,从而抑制树的整体生长。
大多数平衡的 BST 都有某种涉及轮换的再平衡策略,但并非全部都有。不直接涉及旋转的策略的一个值得注意的例子是替罪羊树,它通过从主树中撕下巨大的子树,优化地重建它们,然后将子树粘回主树来重新平衡。从技术上讲,这种方法不涉及任何旋转,并且是实现平衡树的一种非常干净的方法。
也就是说,替罪羊树的最节省空间的实现确实使用旋转将不平衡的树转换为完美平衡的树。您不必使用旋转来执行此操作,但如果空间有限,这可能是最好的方法。
希望这可以帮助!