BST 递归简单插入
BST simple insertion with recursion
我正在尝试编写一个小函数来将节点插入 BST。 "insert" 函数工作正常。我把它改成"insert2",但它不起作用。我不知道为什么它不起作用。 "insert" 和 "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;
}
}
提前致谢。
Java 是一个 pass by value language。这意味着当您将变量传递给方法时,无论是原始变量还是对象,该方法都无法更改该变量,因为它不知道该变量的任何信息。该方法有自己的变量,并且将任何新内容分配给参数变量只会在该范围内持续存在,不会改变其他绑定或对象。
当你有:
public static void update(String str) {
str = "changed";
}
然后做:
String s = "hello";
update(s);
System.out.println(s);
它会打印"hello",因为虽然"hello"的地址被传递给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);
最后一条语句打印 "hello world",而不是 "world world",就好像赋值改变了前一个对象。
那么在您的 insert
方法中发生了什么?
insert2
覆盖了一个局部变量 恰好是null 到一个新的Node,但它与传递的原始参数无关。新创建的节点只能从该范围访问,因此当它 returns 时,新节点已准备好进行垃圾收集。传递给原始方法的树从未发生变化,因此它永远不会获得新值。
如果您查看 insert
,它需要一个非空节点并在该节点或其后代之一上向右或向左 属性 改变。因此,当您检查原始参数时,树发生了变化,因为它没有改变参数,而是改变了对象本身。
改变对象与改变变量不同。
我正在尝试编写一个小函数来将节点插入 BST。 "insert" 函数工作正常。我把它改成"insert2",但它不起作用。我不知道为什么它不起作用。 "insert" 和 "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;
}
}
提前致谢。
Java 是一个 pass by value language。这意味着当您将变量传递给方法时,无论是原始变量还是对象,该方法都无法更改该变量,因为它不知道该变量的任何信息。该方法有自己的变量,并且将任何新内容分配给参数变量只会在该范围内持续存在,不会改变其他绑定或对象。
当你有:
public static void update(String str) {
str = "changed";
}
然后做:
String s = "hello";
update(s);
System.out.println(s);
它会打印"hello",因为虽然"hello"的地址被传递给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);
最后一条语句打印 "hello world",而不是 "world world",就好像赋值改变了前一个对象。
那么在您的 insert
方法中发生了什么?
insert2
覆盖了一个局部变量 恰好是null 到一个新的Node,但它与传递的原始参数无关。新创建的节点只能从该范围访问,因此当它 returns 时,新节点已准备好进行垃圾收集。传递给原始方法的树从未发生变化,因此它永远不会获得新值。
如果您查看 insert
,它需要一个非空节点并在该节点或其后代之一上向右或向左 属性 改变。因此,当您检查原始参数时,树发生了变化,因为它没有改变参数,而是改变了对象本身。
改变对象与改变变量不同。