力扣112 路径总和
题目:
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
示例:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
思路:
递归,求和,遇到叶子节点比较sum和targetSum,相等则返回true。
class Solution {
int sum=0;
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null){
return false;
}
sum+=root.val;
return getPathSum(root,targetSum);
}
public boolean getPathSum(TreeNode root,int targetSum){
if(root.left==null&&root.right==null){//叶子节点
if(sum==targetSum){
return true;
}else{
return false;
}
}
if(root.left!=null){
sum+=root.left.val;
if(getPathSum(root.left,targetSum)) return true;
sum-=root.left.val;//回溯
}
if(root.right!=null){
sum+=root.right.val;
if(getPathSum(root.right,targetSum)) return true;
sum-=root.right.val;//回溯
}
return false;
}
}
也可以扣除,targetSum在遇见叶子节点时,能减至0,则返回true。
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null){
return false;
}
return getPathSum(root,targetSum-root.val);
}
public boolean getPathSum(TreeNode root,int targetSum){
if(root.left==null&&root.right==null){//叶子节点
if(targetSum==0){//扣掉沿途节点值
return true;
}else{
return false;
}
}
if(root.left!=null){
targetSum-=root.left.val;
if(getPathSum(root.left,targetSum)==true){
return true;
}
targetSum+=root.left.val;//回溯
}
if(root.right!=null){
targetSum-=root.right.val;
if(getPathSum(root.right,targetSum)==true){
return true;
}
targetSum+=root.right.val;//回溯
}
return false;
}
}

浙公网安备 33010602011771号