此题和leetcode 560题极为相似,只不过那个题是线性的,这个是树形的,加了一个回溯。
此题就是考虑前缀和历史,每个前缀和都记录下来。如果差值出现,就可以记录总和。
/**
* 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 {
unordered_map<int, int> m;
int presum = 0;
public:
int get(TreeNode* root, int targetSum)
{
if(!root)return 0;
int ans = 0;
presum += root->val;
ans += m[presum];
m[targetSum+presum]++;
ans += get(root->left, targetSum);
ans += get(root->right, targetSum);
m[targetSum+presum]--;
presum -= root->val;
return ans;
}
int pathSum(TreeNode* root, int targetSum) {
m[targetSum] = 1;
return get(root, targetSum);
}
};