AVL插入和平衡环路



我在C++中用自己的代码实现AVL树,但这个问题更多的是关于理解AVL树而不是代码本身。如果它不适合这里,我很抱歉,但我在互联网上爬来爬去,仍然没有找到解决问题的方法。

我的代码在相对较小的输入(25-30位)下可以正常工作,所以我想它应该可以工作更多。我使用的是一个数组,其中保存了插入期间访问过的节点,然后使用while循环。我在需要时提高每个节点的高度,我知道当我找到高度等于的节点时,该过程必须结束(它们的相减结果为0)。

问题在于平衡。虽然我可以找到每个节点的平衡因子并正确地平衡树,但我不确定是应该在平衡后停止调整高度,结束插入循环还是继续进行,直到条件成立,我现在就是想不通。我知道在删除节点和重新平衡树的过程中,我应该不断检查,但我不确定插入和平衡。

任何人都可以对此提供任何见解,也许还可以提供一些文档?

如果一次只插入一个项目:在插入使AVL树失去平衡后,只需要一次(单次或两次)旋转即可重新调整AVL树。http://cis.stvincent.edu/html/tutorials/swd/avltrees/avltrees.html在你知道结论之后,你也许可以自己证明这一点。

仅供未来读者参考如果您已经实现了像我的例子一样的二进制树,则不需要编辑您平衡的节点上方的节点高度:

10
(1)/ (2)
8   16
(1)/ (0)
11 
(Numbers in parenthesis are the height of each sub tree)

假设在上面的树上插入一个具有data=15的节点,则得到的子树如下:

10
(1)/ (2)
8   16
(1)/ (0)
11
(0)/  (1)
15

请注意,尚未编辑子树的先前高度。成功插入后,我们返回插入路径,在本例中为(11, 16, 10)。在跑回这条路径后,我们在需要时编辑高度。这意味着16的子树的左侧高度将为2,而子树的导致AVL树不平衡。通过双重旋转平衡树后,子树为:

15
(1)/  (1)
11  16

所以子树的高度最大为1,和以前一样,所以这个子树根部以上的高度没有改变,改变高度的函数现在必须是return

最新更新