经典题目:判断一棵树中从根到叶子节点的所有路径中,有没有一个路径和是目标数字。
https://leetcode-cn.com/problems/path-sum/
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
一开始写成这样
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root.left==null && root.right==null) return root.val==targetSum;
if(root.left !=null) return hasPathSum(root.left,targetSum-root.val);
if(root.right !=null) return hasPathSum(root.right,targetSum-root.val);
}
}
编译通不过。加了个else的情况
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root.left==null && root.right==null) return root.val==targetSum;
if(root.left !=null) return hasPathSum(root.left,targetSum-root.val);
if(root.right !=null) return hasPathSum(root.right,targetSum-root.val);
return false;
}
}
其实还有两个错误的地方,一个是root没有判空。root判空既是对特殊情况的判断,又是对递归结束条件的判断。第二个是当left不为空单是不满足条件的时候直接返回false,但是如果right满足条件的时候返回的其实应该是true。
所以正确的代码应该是
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null) {
return false;
}
if(root.left==null && root.right==null) {
return root.val==targetSum;
}
return hasPathSum(root.left,targetSum-root.val) || hasPathSum(root.right,targetSum-root.val);
}
}