问题描述
我学习了 C++,但我对 Java 很陌生。我正在尝试编写一个二叉搜索树(BST)类。这是我的代码:
public class binary_tree {
public class node
{
int data;
node left,right;
node(int data,node left,node right)
{
this.data = data;
this.left = left;
this.right = right;
}
}
private node root = null;
public void addElement(int x)
{
addElementNotSeen(x,this.root);
//this function allows the user to only give x
//as a parameter
}
private void addElementNotSeen(int x,node curent)
{
if (curent == null)
{
curent = new node(x,null,null);
}
else
{
if (x > curent.data)addElementNotSeen(x,curent.right);
else addElementNotSeen(x,curent.left);
}
}
}
然而,我的 root 似乎没有任何价值。我已经看到在 Java 中你不需要通过引用传递参数,所以我看不到问题。你能帮我吗?
解决方法
这行代码
curent = new node(x,null,null);
在 addElementNotSeen
之外没有任何影响,因为它只修改本地引用。
引用数据类型参数,例如对象,也是按值传递给方法的。这意味着当方法返回时,传入的引用仍然引用与以前相同的对象。但是,对象字段的值可以在方法中更改,如果它们具有适当的访问级别。
,当您检查 node
是否为 null
然后创建它时,您实际上是在为参数的引用创建一个新节点,而不是为您在函数外部传递的原始引用创建一个新节点。
因此,与其检查 node
中的 null
是否为 addElementNotSeen
,而是检查 this.root
中的 null
是否为 addElement
,并实例化 直接。
public void addElement(int x)
{
if(this.root == null)
this.root = new node(x,null)
else
addElementNotSeen(x,this.root)
}
在树中递归传递数据时也是如此。不要冒险将 null
作为参数传递。检查 left
或 right
是否为空,如果是,则直接创建它们,如前面使用 this.root
的示例所示。
private void addElementNotSeen(int x,node curent)
{
else
{
if (x > curent.data){
if (curent.right == null)
curent.right = new node(data,null);
else
addElementNotSeen(x,curent.right);
}else{
// the same for left
}
}
}