繁体   English   中英

AVL树旋转中的指针

[英]Pointers in AVL 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;
}

对此进行推理的最好方法是将其绘制出来,并一步一步进行:

在函数的开头,我们有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM