路径总和
链接
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
示例 2:
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。
示例 3:
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。
递归法
- 返回值和参数
返回值:就是搜索所有路径,不用处理返回值,所以bool
参数:节点,路径和
bool traversal(TreeNode* cur,int sum)
- 终止条件
到叶子节点,值等于和不等于
if(cur->left==NULL && cur->right==NULL && sum==targetSum) return true;
if(cur->left==NULL && cur->right==NULL && sum!=targetSum) return false;
- 单次递归
sum+=cur->val;//写在判断前,就不需要回溯将sum-=cur->val,此处sum值不影响其他递归的sum值
if(cur->left==NULL && cur->right==NULL && sum==targetSum) return true;//判断叶子节点
if(cur->left==NULL && cur->right==NULL && sum!=targetSum) return false;//判断叶子节点
if(cur->left) if(traversal(cur->left,sum,targetSum))return true;
if(cur->right) if(traversal(cur->right,sum,targetSum)) return true;
return false;
详细写
if(cur->left)
{
sum+=cur->left->val;
if(traversal(cur->left,sum,targetSum))return true;
sum-=cur->left->val;
}
if(cur->right)
{
sum+=cur->right->val;
if(traversal(cur->right,sum,targetSum))return true;
sum-=cur->right->val;
}
sum计算的是一个子节点的值,判断子节点是否符合,不符合sum值要回溯的
如:函数参数的节点输入为1,处理左子节点2,sum+2,判断是否符合,不符合sum-2,这种记得中要加一下,看下面第二个代码
代码
class Solution {
public:
bool traversal(TreeNode* cur,int sum,int targetSum)
{
if(cur==NULL) return false;
sum+=cur->val;
if(cur->left==NULL && cur->right==NULL && sum==targetSum) return true;
if(cur->left==NULL && cur->right==NULL && sum!=targetSum) return false;
if(cur->left) if(traversal(cur->left,sum,targetSum))return true;
if(cur->right) if(traversal(cur->right,sum,targetSum)) return true;
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
int sum=0;
return traversal(root,sum,targetSum);
}
};
class Solution {
public:
bool traversal(TreeNode* cur,int sum,int targetSum)
{
if(cur==NULL) return false;
// sum+=cur->val;
if(cur->left==NULL && cur->right==NULL && sum==targetSum) return true;
if(cur->left==NULL && cur->right==NULL && sum!=targetSum) return false;
if(cur->left)
{
sum+=cur->left->val;
if(traversal(cur->left,sum,targetSum))return true;
sum-=cur->left->val;
}
if(cur->right)
{
sum+=cur->right->val;
if(traversal(cur->right,sum,targetSum))return true;
sum-=cur->right->val;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
int sum=0;
if(root!=NULL) sum=root->val; //用详细的,中间节点就没有计算了,要加上去
return traversal(root,sum,targetSum);
}
};