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将被复制并用于左子树。它不会修改当前函数中的“总和”。