/解决了/ 我实际上通过了null。由于它不包含任何信息,因此向其中添加值不会影响我的树,谢谢您的回答!
我们在Java中有一个任务来创建一个可以容纳整数的二叉树。我们必须编写一个insert函数,巧合地将整数插入到树中。我现在已经编写了该函数,但是不知何故它不添加我输入的值。
我的课程包括一个整数“值”和左右两个分支的两个引用“左”和“右”。 另外,我必须以这种方式编写此函数,因此它们必须返回void,我知道还有更简单的方法。
因此,就目前而言,我已经知道我已经准备就绪。然后是t == null。当我尝试时,然后输入“ t = new CONSTRUCTOR(value,...)” 它没有任何改变。
public void insert_in_tree(int i) {
/*Creating random number*/
Random rand = new Random();
int rand_num = rand.nextInt(2);
if(rand_num == 0) {
setLeft(this.left, i);
} else {
setRight(this.right, i);
}
}
...这是“ setLeft”的代码(“ setRight”功能是相同的,我只是在调用它时传递了正确的子树)功能:
void setLeft(IntBinTree t, int value) {
if(t == null) {
t = new IntBinTree(value, null, null);
return;
}
int i = 0;
/*Random number*/
Random rand = new Random();
int rand_num = rand.nextInt(2);
/*Calling either left or right*/
if(rand_num == 0) setLeft(t.left, value);
setRight(t.right, value);
}
我想,错误是调用函数,然后更改局部变量“ t”而不是使用“ this”。但是,由于我传递的是“ this”的引用,因此这样做应该没有问题,有人可以发现错误吗?
答案 0 :(得分:0)
您正在将null传递给函数。不是对象。
如果您传递了一个对象(例如“ this”),它将把引用传递给该对象(实际上,Java是“ Pass by value”,但是按值传递的是引用,而不是对象本身)及其任何更改都会反映在功能之外。
传递null不会这样做,因为没有对象引用,而您只是传递的值“ null”与原始对象没有任何关系,因此在第二个函数内对“ t”所做的任何更改都是迷路了。
您应该做的是以下两件事之一:
传递“ this”和左/右标志。
在调用方中创建左/右子树(如果为空),则传递新创建并分配的子树。
顺便说一下,顶层方法和set方法中的左/右代码几乎相同-将其完全保留在set方法中会更容易。