我无法理解为什么下面的树旋转代码有效。如果T2
指向y.left
而y.left
指向x
,则这使得最后一次作业x.right = T2
等于x.right = x
?不应该指针指向最初的T2
?
Node leftRotate(Node x) {
Node y = x.right;
Node T2 = y.left;
// Perform rotation
y.left = x;
x.right = T2;
// Update heights
x.height = max(height(x.left), height(x.right)) + 1;
y.height = max(height(y.left), height(y.right)) + 1;
// Return new root
return y;
}
答案 0 :(得分:0)
理解这一点的最好方法是把它画出来并一步一步地完成它:
在函数的开头我们有Node x:
x
/ \
L R
/ \
l1 r1
现在我们说y = R。
R
/ \
L1 R1
节点T2 = R.Left,即l2
然后轮换:
y.left(R1.Left)= x
R
/ \
x R1
/ \
l R
/ \
l1 r1
x.right = T2(l1)
R
/ \
x r1
/ \
l l1
我发现所有尝试的一个很好的资源(尽管在C中)是eternally confuzzled
答案 1 :(得分:0)
Node T2 = y.left;
这一行使T2
指向该行运行时指向的同一位置。如果y.left
更新为指向另一个对象 - y.left
,在这种情况下 - 更改不反映在x
中。
请注意,如果有人更改了该对象的属性,那么将反映更改。例如。代码
T2
然后Node T2 = y.left;
y.left.foo = bar;
会将更改反映为T2.foo
。这是对未反映的bar
引用的更改。这在Java中非常普遍,与整个“引用按值传递”有关。