我正在尝试编写一个小函数来将节点插入到BST中。 "插入"功能正常。我将其更改为" insert2",它不起作用。我无法弄清楚它为什么不起作用。 "插入"之间有什么区别?和" insert2"在运行时?
插入方法
public void insert(Node node, int x) {
if (x < node.val) {
if (node.left == null) node.left = new Node(x);
else insert(node.left, x);
} else {
if (node.right == null) node.right = new Node(x);
else insert(node.right, x);
}
}
insert2方法
public void insert2(Node node, int x) {
if (node == null) {
node = new Node(x);
return;
}
if (x < node.val) insert2(node.left, x);
else insert2(node.right, x);
}
节点的定义
public class Node {
int val;
Node left, right;
public Node (int _val) {
this.val = _val;
}
}
提前致谢。
答案 0 :(得分:1)
Java是pass by value language。这意味着当您将变量传递给方法(基元或对象)时,该方法无法更改该变量,因为它对该变量一无所知。该方法具有自己的变量,并且为参数变量分配任何新内容仅在该范围内保留,并且不会改变其他绑定或对象。
当你有:
public static void update(String str) {
str = "changed";
}
并做:
String s = "hello";
update(s);
System.out.println(s);
它将打印&#34;你好&#34;因为虽然地址是&#34;你好&#34;传递给update
,更新只将本地变量更新为新字符串的地址。赋值从未更改用于应用方法的变量或两个变量指向的对象。
String h = "hello";
String w = "world";
String x = h; // x points to the same string as h
x = w; // x got it's value changed to point to w
System.out.println(h + " " + w);
最后一句话打印&#34; hello world&#34 ;, not&#34; world world&#34;好像赋值变异了前一个对象。
那么您的insert
方法发生了什么?
insert2
会覆盖一个局部变量,该变量恰好为新节点的null,但它与传递的原始参数无关。新创建的节点只能从该范围访问,因此当它返回时,新节点已准备好进行垃圾回收。传递给原始方法的树从未变异,因此它永远不会获得新值。
如果你看insert
它需要一个非空节点,并在该节点或其中一个后代上改变右或左属性。因此,当你检查原始参数时,树已经改变,因为它没有改变参数,而是对象本身。
变异对象与变异变量不同。