为什么该方法不起作用?
why the method doesnt work?
此方法假设将节点添加到二叉树中。
我不明白为什么它不这样做以及我哪里错了。
root 随时保持为空。
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));
}
问题来自:
private void add(int num, Node t)
{
if (t == null)
t = new Node(num);
//...
}
假设这是 BTree
class 的方法并且您将 root
初始化为 null
,当您调用:
add(1, root);
当方法退出时,root
将不包含新创建的节点。你可以这样做:
public void add(int num)
{
if (root == null) {
root = new Node(num);
}
else {
add(num, root);
}
}
并删除 add(int num, Node t)
方法中的 if (t == null)
。
问题是根节点是按值而不是按引用传递给 add 方法的。 Java 按值而不是按引用传递对象。查看下面的 link 以进一步解释
Is Java "pass-by-reference" or "pass-by-value"?。
修改你代码的add方法如下
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;
}
此方法假设将节点添加到二叉树中。
我不明白为什么它不这样做以及我哪里错了。
root 随时保持为空。
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));
}
问题来自:
private void add(int num, Node t)
{
if (t == null)
t = new Node(num);
//...
}
假设这是 BTree
class 的方法并且您将 root
初始化为 null
,当您调用:
add(1, root);
当方法退出时,root
将不包含新创建的节点。你可以这样做:
public void add(int num)
{
if (root == null) {
root = new Node(num);
}
else {
add(num, root);
}
}
并删除 add(int num, Node t)
方法中的 if (t == null)
。
问题是根节点是按值而不是按引用传递给 add 方法的。 Java 按值而不是按引用传递对象。查看下面的 link 以进一步解释 Is Java "pass-by-reference" or "pass-by-value"?。
修改你代码的add方法如下
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;
}