Java AVL树旋转中的指针

Java AVL树旋转中的指针,java,avl-tree,tree-rotation,Java,Avl Tree,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

我很难理解树下旋转代码的工作原理。如果
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;
}

对此进行推理的最佳方法是将其抽出,并一步一步地进行:

在函数的开头,我们有节点x:

   x
  /  \
 L    R
     /   \
    l1    r1
现在我们说y=R

  R
 /  \
L1   R1
节点T2=左侧,即l2

然后轮换:

y、 左(R1.左)=x

x、 右=T2(l1)

我为所有东西的尝试(尽管是C)找到了一个很好的资源

该行使
T2
指向运行该行时指向的同一位置
y.left
。如果
y.left
被更新为指向不同的对象--
x
,在这种情况下--
T2
中不会反映该更改

请注意,如果有人更改了该对象的属性,则该更改将得到反映。例如,代码

Node T2 = y.left;
y.left.foo = bar;
然后
T2.foo
将反映对
bar
的更改。是对
y.left
引用的内容的更改没有反映出来。这在Java中是一个相当普遍的事情,与整个“引用通过值传递”的事情有关

    R
   /  \
  x    r1
 / \
l   l1
Node T2 = y.left;
Node T2 = y.left;
y.left.foo = bar;