【问题标题】:AVL Tree Deletion RulesAVL 树删除规则
【发布时间】:2017-11-06 11:53:38
【问题描述】:

对于 AVL 树,当从需要重组的树中删除一个节点时,我正在阅读的书指出,要遵循某些规则来选择要重组的节点。一个例子是这样的:

       44
     /   \
    17   62
        /  \
       50  78
      /  \   \
     48  54  88

这是在删除节点(节点 17 的子节点)并且违反了 height-balance 属性之后的 AVL 树。

我读的书说它会让 z 成为从节点 17 向上遇到的第一个不平衡位置,y 是 z 的高度较大的孩子,最后 x 是 y 的高度较高的孩子。但是,如果 y 的孩子都具有相同的高度,则 x 将与 y 位于同一侧。在这种情况下,x 是 78,y 是 62,z 是 44。

现在这是提出的问题。为什么我们选择 x 使其与 y 位于同一侧?如果我选择 x 与 y 不在同一侧,AVL 树会出现任何问题吗?我试图给自己举个例子,并尝试选择这两种类型的 x 并重组 AVL 树。但是,我似乎找不到任何选择 x 作为孩子的问题。任何帮助都可以帮助我解决这个问题。

【问题讨论】:

  • 有趣..你能分享你的分析,你在哪里采取了 x 不是 y 的孩子吗?
  • @KarthikBalaguru 是否有可能让 x 不是 y 的孩子?重组将如何进行?以前没有想到这一点。
  • 根据标准的三节点重组方法,它是通过仅将 x 作为 y 的子节点来完成的。简单来说,它是一种针对导致负载不平衡的路径并对其进行修复。因此,为了识别和修复该路径,一旦违反高度平衡,z 将成为第一个不平衡节点,y 应为 z 的最高子节点,x 应为 z 的孙子节点,因此它是 y 的最高子节点。据我所知,三节点重组程序始终如一地说 - 如果 y 的一个孩子高于其他孩子,则 x 是更高的孩子,否则 x 是 y 的孩子,与 y 是 z 的边相同。

标签: data-structures tree binary-search-tree avl-tree


【解决方案1】:

有趣的是,这个主题在各种网络论坛中有很多不同的答案。我尝试创建所有可能的 AVL 树节点删除方案,我观察到如果从 AVL 树的左侧删除节点以使树不平衡,则根据节点可用性执行 LL 或 LR(任何可能的旋转),并且树得到均衡。 右节点删除反之亦然。

另外,需要确定由于旋转而移动的节点是否有子节点,如果它们在旋转之前是左侧或右侧,则分别插入左侧或右侧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多