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只涉及一个旋转?不一定。之所以只需要一次旋转,是因为旋转方向相反的子树是平衡的。