Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Avl树左旋转&;左右旋转用法混淆_Algorithm_Binary Search Tree_Avl Tree - Fatal编程技术网

Algorithm Avl树左旋转&;左右旋转用法混淆

Algorithm Avl树左旋转&;左右旋转用法混淆,algorithm,binary-search-tree,avl-tree,Algorithm,Binary Search Tree,Avl Tree,假设我们有以下结构: A / \ B C / \ D E 现在,如果C被移除 A / B / \ D E 在这一点上,我研究的每个算法都会进行以下检查: if (Balance-Factor(B)>=0) do **Left** rotation else do **Left-Right** rotation; 但是,为什么这个条件必须保持在这里呢?如中所示,如果我在上面的树上进行左

假设我们有以下结构:

        A
      /   \
     B     C
    / \
   D   E
现在,如果C被移除

     A
    /
   B
  / \
 D   E
在这一点上,我研究的每个算法都会进行以下检查:

if (Balance-Factor(B)>=0) do **Left** rotation
else do **Left-Right** rotation;
但是,为什么这个条件必须保持在这里呢?如中所示,如果我在上面的树上进行左右旋转,似乎我仍然会得到一个平衡的树:

              E
             / \
            B   A
           /
          D
那么,为什么在这种情况下,即使是一个左右旋转也会给我们一个平衡树,我们只需要进行左旋转呢?

之所以只需要“左”旋转,是因为节点a的平衡因子是第一个满足再平衡标准的节点

将每个子树看作是一个标尺上的权重,其中这些权重的“权重”就是子树的“高度”

删除后,B、E和D是平衡的

A的右子树的“权重”为0,左子树的“权重”为2


此差值大于1,朝向左子树。由于左子树是平衡的,因此只需要在a处向右子树进行一次旋转

这种混淆源于大多数avl教程中对旋转的命名

名称:左、右、右、右

案例:L、R、LL、RR、LR、RL

大多数avl教程排除单个旋转的命名的一个可能原因是,单个旋转可以使用LL和RR代码。基本上,2个单旋转代码是其相应双旋转代码的一部分

换句话说,如果LL和RR代码编写正确,它们也可以用于单次旋转

在您的示例中,这种情况是一次旋转。 使用LL代码的L旋转。 这就是您不能使用LR代码的原因。
因为这种情况甚至不是一个双旋转开始

证明:

      A
     / \
    B   G
   / \   \
  C   E   H
 /     \
D       F
删除H:

      A
     / \
    B   G
   / \   
  C   E   
 /     \
D       F
使用LR旋转:

      E
     / \
    B   A
   /   / \
  C   F   G
 /     
D           

Remains UnBalanced
      B
     / \
    C   A
   /   / \
  D   E   G
       \
        F

Is Balanced 
使用LL旋转:

      E
     / \
    B   A
   /   / \
  C   F   G
 /     
D           

Remains UnBalanced
      B
     / \
    C   A
   /   / \
  D   E   G
       \
        F

Is Balanced 

没有发生单次左旋转。这是没有意义的,因为树需要在右边重新平衡,你所说的右旋转,我指的是左旋转。顺时针=右。逆时针=左。这就是我学习它的方式,因为这是节点移动的方向,所以我们选择L而不是LR的唯一原因是因为LR涉及两个旋转,而L只涉及一个旋转?不一定。之所以只需要一次旋转,是因为旋转方向相反的子树是平衡的。