此方法假设将节点添加到二叉树。
我不明白为什么它没有这样做以及我有错误的地方。
root随时都会保持为null。
public void add(int num)
{
add(num, root);
}
private void add(int num, Node t)
{
if (t == null)
t = new Node(num);
else if (t.getLeftSon() == null)
t.setLeftSon(new Node (num));
}
答案 0 :(得分:1)
问题来自:
private void add(int num, Node t)
{
if (t == null)
t = new Node(num);
//...
}
假设这是BTree
课程的方法,并且您将root
初始化为null
,请致电:
add(1, root);
方法退出时, root
将不包含新创建的节点。你可以这样做:
public void add(int num)
{
if (root == null) {
root = new Node(num);
}
else {
add(num, root);
}
}
并删除if (t == null)
方法中的add(int num, Node t)
。
答案 1 :(得分:1)
问题是根节点是按值而不是通过引用传递给add方法的。 Java按值传递对象,而不是按引用传递。请查看以下链接以获取进一步说明 Is Java "pass-by-reference" or "pass-by-value"?。
修改代码的添加方法,如下所示
public void add(int num) {
root = add(num, root);
}
private Node add(int num, Node t) {
if (t == null)
return t = new Node(num);
else if (t.getLeftSon() == null)
t.setLeftSon(new Node(num));
else if (t.getRightSon() == null)
t.setRightSon(new Node(num));
else if (Math.abs(height(t.getLeftSon()) - height(t.getRightSon())) <= 1)
t.setLeftSon(add(num, t.getLeftSon()));
else
t.setRightSon(add(num, t.getRightSon()));
return t;
}