给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
笔记:
①用map记录前缀和m
②前缀和Sn,Sm分别表示前n个和m个结点的节点值和,其中n>m,只要找到Sn-Sm==targetSum就可知道m,m+1,m+2…n-2,n-1,n为所求的一条路径
③退出当前节点时要将当前节点的前缀和删去
④单个节点的值最大为10^9,所有结点的值的和可能大于int范围,所以用long long储存前缀和
/**
* 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:
map<long long,int> m;
int pathSum(TreeNode* root, int targetSum) {
m[0]=1;
return dfs(root,0,targetSum);
}
int dfs(TreeNode *root,long long curval,int targetSum)
{
if(!root)return 0;
int ans=0;
curval+=root->val;
if(m.count(curval-targetSum))
{
ans=m[curval-targetSum];
}
m[curval]++;
ans+=dfs(root->left,curval,targetSum);
ans+=dfs(root->right,curval,targetSum);
m[curval]--;
return ans;
}
};