Java 使用递归检查树路径中是否存在和

Java 使用递归检查树路径中是否存在和,java,recursion,tree,binary-search-tree,Java,Recursion,Tree,Binary Search Tree,我试图解决树中的一个问题,我们必须检查完整路径(从根到叶)是否会导致求和值(由用户给出)。我成功地做到了这一点,下面是代码 public boolean hasPathSum(TreeNode root, int sum) { if(root==null) { return false; } sum = sum - root.val; if(sum==0 && root

我试图解决树中的一个问题,我们必须检查完整路径(从根到叶)是否会导致求和值(由用户给出)。我成功地做到了这一点,下面是代码

    public boolean hasPathSum(TreeNode root, int sum) {
        if(root==null)
        {
            return false;
        }
        sum = sum - root.val;
        if(sum==0 && root!=null && root.left==null && root.right==null)
        {
            return true;
        }
        boolean b1 = hasPathSum(root.left,sum);
        boolean b2 = hasPathSum(root.right,sum);
        return b1||b2;
    }
}

我在理解代码时遇到的主要问题是,当我们向下移动
root.left
的递归函数时,sum的值会发生变化,当sum传递到
root.right
语句中时,sum的值会发生变化。我们希望在第二个函数中传递的sum值是该给定点的值(由于sum通过第一个函数传递,因此应该更改该值),但该代码似乎仍能正常运行。

递归的美妙之处在于,当堆栈展开时,它将与当前使用的方法具有相同的值

一堆就像一堆。因此,顶部的方法就是当前正在执行的方法。每当执行一个新方法时,先前的方法及其状态都会被冻结。因此,在下面的堆栈描述中,当调用
Latest Call
时,它下面的方法没有变化

hasPathSum(root.left.left, sum - root.val - root.left.val); --> Latest Call
hasPathSum(root.left, sum - root.val); --> Mid Call
hasPathsum(root, sum); --> First Call
您的“sum”(方法签名的形式参数)被声明为基元类型。 这将确保其值仅存在于当前堆栈帧中。如果沿着递归链进行更改,则该更改将局限于发生递归调用的帧


每个方法调用都会“查看”它自己的sum变量副本和值,直到该方法返回一个值,并将更新后的值向下传递到递归链。

sum
int
的类型被声明为基元。
在Java中,当使用args调用方法时,该方法将获得args值的副本。Primitive type将获得值的副本,而class instance(object)方法将获得对象引用的副本。

递归的美妙之处在于当堆栈展开时,它将具有与当前使用的方法相同的值。因此,如果我在
hasPathSum(root.left,sum)
中不断向下更改sum…当第一次调用
root.right
时,sum的值仍将保留传递给它上面的root.left函数的sum值?是,因为值和是“按值传递的”。这意味着,当您为左子树调用函数时,值sum将被复制并用于左子树。它不会修改当前函数中的“总和”。