如何跟踪这个递归函数?

时间:2016-06-17 01:19:14

标签: java recursion

我找到了这个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。 有什么帮助吗?

2 个答案:

答案 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 nnull时进行。那会是什么时候?在其中一片叶子里。只有这样才会创建另一个添加到树中的对象。

之后,它只是return n的逻辑:在最后一次通话后,n为:new Node(e)。新的Node将被分配给谁?一些(前)叶n.leftn.right。在树中达到方法add的第一次调用之前,相同的逻辑会使树生成。这将返回完整更新的树 - 您想要的最终产品。