题目
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
思路
当题目提到叶子节点的概念时,是在暗示一个终结递归的条件:
if(root.left == null && root.right == null) return XXX
终结递归的 return
要注意返回类型是要与递归方法的返回类型关联起来的,比如
- 递归方法返回值类型为Boolean,return可以是true、false、或者判断式
- 递归方法返回值类型为int,return可以是0、-1
这道题需要我们找到从根节点到叶子节点的节点值之和为targetSum
,所以在每轮递归,我们需要判断的就是:是否存在从当前节点的子节点到叶子节点的路径和满足 targetSum - val
如果当前节点是叶子节点,即可直接返回 targetSum与val值是否相等
如果当前节点不是叶子节点,进行递归,targetSum值减去当前节点的val值
代码实现
public boolean hasPathSum(TreeNode root, int targetSum) {
//递归结束的条件
if(root == null) return false;
//如果为叶子节点,返回剩余比较结果,true表示存在路径,否则表示不存在
if(root.left == null && root.right == null) return targetSum == root.val;
//递归
return hasPathSum(root.left,targetSum - root.val) || hasPathSum(root.right,targetSum - root.val);
}
总结
- 当题目提到叶子节点的概念时,是在暗示一个终结递归的条件
- 注意返回类型是要与递归方法的返回类型关联起来的