112. 路径总和
难度简单800
给你二叉树的根节点 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解释:由于树是空的,所以不存在根节点到叶子节点的路径。
提示:
- 树中节点的数目在范围 [0, 5000] 内
- -1000 <= Node.val <= 1000
- -1000 <= targetSum <= 1000
思路
- 设置累加的数组,往下遍历获得的路程,不断向上累加
- 失败点:左右节点分开处理,当处理右节点时,其值相当于分别与根和左节点相加(设置队列,左右节点一起进入)
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
queue<TreeNode*> cur;//当前在队列中的节点
queue<int> dp;
int flag=0;//没有找到target满足的路径
if(root==NULL) return 0;
cur.push(root);
dp.push(root->val);
while(!cur.empty())
{
root=cur.front();
cur.pop();
int p=dp.front();
dp.pop();
if(p==targetSum){
//判断是否叶子节点
if(root->left==NULL&&root->right==NULL){
return 1;
}
}
//左子树一起入队
if(root->left!=NULL){
cur.push(root->left);
int a=p+root->left->val;
dp.push(a);
}
//右子树一起入队
if(root->right!=NULL){
cur.push(root->right);
int b=p+root->right->val;
dp.push(b);
}
}
return flag;
}
};