路径总和(简单)
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
解法一:广度优先搜索
假设从根节点到当前节点的总和为val
class Solution {
public:
bool result=false;
void dfs(TreeNode *node,int sum,int targetSum){
if(node->left==nullptr && node->right==nullptr){
if(sum==targetSum){
result=true;
return;
}
else{
return;
}
}
if(node->left){
dfs(node->left,sum+node->left->val,targetSum);
}
if(node->right){
dfs(node->right,sum+node->right->val,targetSum);
}
return;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr){
return false;
}
dfs(root,root->val,targetSum);
return result;
}
};
解法二: 递归
判断是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
if (root == nullptr) {
return false;
}
if (root->left == nullptr && root->right == nullptr) {
return sum == root->val;
}
\\当前节点不是叶子节点,递归询问它的子节点是否能满足条件
return hasPathSum(root->left, sum - root->val) ||
hasPathSum(root->right, sum - root->val);
}
};