【发布时间】:2015-08-18 16:00:44
【问题描述】:
我尝试编写一个递归函数来将节点添加到二叉树中。
问题是虽然根在插入第一个元素后有一个新值
(由 System.out.println() 确认),当我尝试通过 System.out.println() 获取 main 中的根值时,它仍然为空;
package polo;
public class BTNode {
public int value;
public BTNode left;
public BTNode right;
BTNode(int value){
this.value = value;
left = null;
right = null;
}
}
package polo;
public class Tree {
public BTNode root;
public Tree() {
root = null;
}
public void add(int i, BTNode n) {
if (n == null) {
n = new BTNode(i);
System.out.println("New root value : " + n.value);
} else {
if (i < n.value) {
if (n.left == null) {
n.left = new BTNode(i);
} else {
add(i, n.left);
}
} else { // i >= n.value
if (n.right == null) {
n.right = new BTNode(i);
} else {
add(i, n.right);
}
}
}
}
public static void main(String[] args) {
Tree t = new Tree();
t.add(3, t.root);
System.out.println(t.root.value);
}
}
命令行输出为:
新根值:3
线程“main”中的异常 java.lang.NullPointerException at polo.Tree.main(Tree.java:57)
(第 57 行是 System.out.println(t.root.value); 所在的位置)
【问题讨论】:
-
对不起,我不明白你的评论。没有元素时根为空,但插入新元素后(root = new Node())它不应该为空?
-
@HovercraftFullOfEels 如果您不了解 Java 如何将参数传递给函数,这不是常识(有一个
n = ...可能会更改root)。 -
顺便说一句:开发这棵树,使调用者只传递他们想要添加的值。不要让他们知道内部节点结构的任何事情。
-
@HovercraftFullOfEels
root以n的形式传递给add,然后重新分配。在 Java 中,如果您修改它,这将起作用,但如果您重新分配它,则不会。如果没有深入了解 Java 的工作原理,这种差异可能没有意义。至少这是我的观点。 -
相关阅读-Is Java “pass-by-reference” or “pass-by-value”?(间接回答你的问题)
标签: java tree binary-search-tree