插入平衡环 我在C++中用自己的代码实现AVL树,但是这个问题更多的是关于理解 AVL树,而不是代码本身。我很抱歉,如果它不适合这里,但我已经通过互联网,我仍然没有找到解决我的问题的办法

插入平衡环 我在C++中用自己的代码实现AVL树,但是这个问题更多的是关于理解 AVL树,而不是代码本身。我很抱歉,如果它不适合这里,但我已经通过互联网,我仍然没有找到解决我的问题的办法,c++,algorithm,avl-tree,C++,Algorithm,Avl Tree,我的代码在相对较小的输入(约25-30位)下按预期工作,因此我认为它应该可以工作更多。我使用的是一个数组,在数组中我保存了插入过程中访问过的节点,然后使用while循环,我会在需要时提高每个节点的高度,我知道当我找到一个高度相等的节点(它们的减法结果是0,也就是0)时,这个过程必须结束 问题是在平衡方面。虽然我可以找到每个节点的平衡因子并正确地平衡树,但我不确定是否应该在平衡后停止调整高度,而只是结束插入循环,或者继续进行,直到达到条件为止,我现在无法理解。我知道,在删除节点和重新平衡树的过程中

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

问题是在平衡方面。虽然我可以找到每个节点的平衡因子并正确地平衡树,但我不确定是否应该在平衡后停止调整高度,而只是结束插入循环,或者继续进行,直到达到条件为止,我现在无法理解。我知道,在删除节点和重新平衡树的过程中,我应该不断检查,但我不确定插入和平衡


如果一次只插入一个项目,任何人都可以对此提供任何见解,或者提供一些文档?

如果插入使AVL树失去平衡,则只需旋转一次(单次或双次)即可重新调整AVL树。知道结论后,您可能可以自己证明。

仅供未来读者参考,如果您实现了二叉树(如我的示例所示),则无需编辑平衡节点上方的节点高度:

           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,而右侧高度为0,导致AVL树不平衡。通过双旋转平衡树后,子树为:

             15
         (1)/  \(1)
           11  16

因此,子树高度最大值为1,与以前一样,因此此子树根以上的高度没有改变,更改高度的函数现在必须返回。

您是否只能访问此站点?谷歌搜索“AVL树”怎么样?你可以从源代码中得到详细的解释,就像在我更新的帖子中一样,这与我的问题无关。我知道一次旋转足以使其再次成为AVL,我的问题是,在执行旋转后,我是否必须调整旋转节点上方的任何节点高度?是的,您需要在旋转后更新高度。