非常快的问题。 我正在研究三叉树的删除方法。我的方法很简单,我通过用node.left对象替换节点对象来删除和连接。
public void delete(int key, Node node) {
if (node == null) {
throw new RuntimeException();
} else if (key < node.key) {
delete(key, node.left) ;
} else if (key > node.key) {
delete(key, node.right);
} else {
//found the node to delete, delete from here.
if (node.mid != null) {
node = node.mid;
}
else if (node.left == null) {
node = node.right;
}
else if (node.right == null) {
node = node.left;
//node.key=node.left.key;
}
else {
node= findMin(node.right);
}
}
}
这是代码的一部分。但是,它不起作用,也就是说,它的关键node.key仍然是相同的。
else if (node.right == null){
node = node.left;
}
但是如果我明确地写了node.key,那么它就可以了。
else if (node.right == null){
node.key=node.left.key;
}
为什么? 我永远无法理解对象和引用的东西,geez ...谢谢你们。
答案 0 :(得分:0)
这是因为在第一种情况下,您根本不会更改应该跟踪下一个要寻址的节点的密钥
答案 1 :(得分:0)
问题并不完全清楚,但我认为你必须看到java规范:java通过副本传递值。因此,如果指定的代码是方法而节点是函数的参数,则传递的对象将不会更改,引用的对象(在您的情况下为“key”)是。
请参阅Is Java "pass-by-reference" or "pass-by-value"?
我希望它有所帮助。