[英]Pointers in AVL Tree Rotation
我很难理解下面的树旋转代码为何起作用。 如果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;
}
对此进行推理的最好方法是将其绘制出来,并一步一步进行:
在函数的开头,我们有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中) 永远被迷惑
Node T2 = y.left;
该y.left
T2
指向运行该行时 y.left
指向的相同位置。 如果y.left
更新为指向另一个对象-在这种情况下为x
该更改不会反映在T2
。
请注意,如果有人更改了该对象的属性 , 该更改将得到反映。 例如代码
Node T2 = y.left;
y.left.foo = bar;
然后T2.foo
将反映对bar
的更改。 它改变了y.left
所引用的内容 ,但没有反映出来。 这是Java中相当普遍的事情,与整个“按值传递引用”有关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.