我找到了这个Java递归程序,用于将元素添加到二叉搜索树中:
public void add(int e){
root=add(root, e);
}
public Node add(Node n, int e){
if (n==null){
n=new Node(e);
} else {
if (e<n.elem){
n.left=add(n.left,e);
} else{
n.right=add(n.right,e);
}
}
return n;
}
我不明白为什么它必须在最后返回n然后再将它分配给root。 有什么帮助吗?
答案 0 :(得分:4)
分配的原因是Java只有一种传递参数的方法 - 按值。
对root
的引用按值传递给add
方法。但是,add
需要修改作为根传递给它的节点:例如,当您将第一个节点添加到树时,root
的值为null
,但它需要在添加节点后变为非null
。
解决此限制的习惯用法是创建一个返回修改后的值的方法,并将其分配回参数。这就是您的add
方法在这里做的事情
root=add(root,e);
在这里
n.left = add(n.left, e);
n.right = add(n.right, e);
答案 1 :(得分:0)
如果你想了解递归,你需要查看结束它的条件:
if (n==null) n=new Node(e);
。
这意味着最后一次通话将在Node n
为null
时进行。那会是什么时候?在其中一片叶子里。只有这样才会创建另一个添加到树中的对象。
之后,它只是return n
的逻辑:在最后一次通话后,n
为:new Node(e)
。新的Node
将被分配给谁?一些(前)叶n.left
或n.right
。在树中达到方法add
的第一次调用之前,相同的逻辑会使树生成。这将返回完整更新的树 - 您想要的最终产品。