AVL树旋转中的指针

时间:2017-05-31 23:23:35

标签: java avl-tree tree-rotation

我无法理解为什么下面的树旋转代码有效。如果T2指向y.lefty.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;
}

2 个答案:

答案 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中非常普遍,与整个“引用按值传递”有关。