题目描述
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例 1:

输入 :root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出 :3
解释 :和等于 8 的路径有 3 条,如图所示。
示例 2:
输入 :root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出 :3
提示:
二叉树的节点个数的范围是 [0,1000]
−109<=Node.val<=109-10^9 <= Node.val <= 10^9−109<=Node.val<=109
-1000 <= targetSum <= 1000
思路
见代码。
代码
cpp
/**
* 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:
unordered_map<long long, int>mp;
int pathSum(TreeNode* root, int targetSum) {
mp[0] = 1;
return dfs(root, 0, targetSum);
}
int dfs(TreeNode *root, long long curr, int targetSum)
{
if(root == nullptr) return 0;
// 当前结点的答案
int res = 0;
// 现在总和
curr += root->val;
// 若有和前面结点相加为targetSum,更新答案
if(mp.count(curr - targetSum))
{
res = mp[curr - targetSum];
}
++mp[curr];
res += dfs(root->left, curr, targetSum);
res += dfs(root->right, curr, targetSum);
// 只在自己的子树内生效, 不允许在其他字数出现
--mp[curr];
return res;
}
};