AVL树平衡

时间:2011-06-14 13:49:22

标签: binary-tree avl-tree

给出下面的AVL树:

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

可以在40,向右进行一次旋转吗?做到这样:

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果原始问题仅使用不平衡的AVL树(而不是在添加或删除节点之前的平衡树),则单次旋转是有效的答案。

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

答案 2 :(得分:0)

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

  

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

     

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

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

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

尽管如此,这两个答案都是正确的,取决于您使用的算法及其遵循的规则。