【问题标题】:AVL trees balancingAVL 树平衡
【发布时间】:2011-09-14 17:32:16
【问题描述】:

给定下面的 AVL 树:

        23
       /    \     
   19        35
  /  \      /  \     
 8   20   27    40
               /
             38
             /
            36

可以在 40 度时进行一次旋转,向右吗?让它变成这样:

        23
      /    \     
   19        35
  /  \      /  \     
 8   20   27    38
               /  \
             36    40

它仍然符合与左子树相比具有 -+1 高度的 AVL 属性。

在答案中它进行了两次旋转,因此上面 35 处的子树看起来像这样:

        23
      /    \     
   19        38
  /  \      /  \     
 8   20   35    40
         /  \
        27  36    

如果它们都没有违反 height 属性,我不明白何时进行双旋转以及何时进行单旋转。

【问题讨论】:

  • +1 只为酷酷的小树。

标签: binary-tree avl-tree


【解决方案1】:

双重旋转可能是由于使用了特定的 AVL 算法。在我看来,这两个答案都像是有效的 AVL 树。

【讨论】:

    【解决方案2】:

    如果最初的问题只给出了不平衡的 AVL 树(而不是在添加或删除节点之前的平衡树),那么单次旋转是一个有效的答案。

    如果问题在添加或删除节点之前提供了AVL树,则重新平衡算法可能会导致发生双重旋转。

    【讨论】:

    • 你说得对,它是延续。这是 avl 平衡的最后一步。在此之前还有其他步骤。好吧,我又做了几次这个和另一个例子。我突然想到,在继续下一步之前,可能需要用节点填充所有行。因此,与不填充该节点但仍不会违反 -+1 高度属性的旋转相比,填充空节点的旋转可能更有利。
    【解决方案3】:

    根据我使用的文献,这两个答案都是正确的:

    有四种类型的旋转 LL、RR、LR 和 RL。 这些轮换是 以最近的祖先 A 为特征,插入节点 N,其 平衡因子变为 2。

    得到以下旋转类型的表征:

    1. LL:N被插入到A的左子树的左子树中
    2. LR:N被插入到A的左子树的右子树中
    3. RR:N被插入到A的右子树的右子树中
    4. RL:N被插入到A的右子树的左子树中

    根据这些规则,在您的示例中,平衡因子变为 2 的最近祖先是 40,并且插入是在 40 的左子树的左子树中进行的,因此您必须执行 LL 旋转。遵循这些规则,您的第一个答案将是所选操作。

    不过,两个答案都是正确的,并且取决于您使用的算法及其遵循的规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2014-01-29
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多