You are given a binary tree in which each node contains an integer value.
Find the number of paths that sum to a given value.
The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes).
The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000.
Example:
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3 / \ \ 3 2 11 / \ \ 3 -2 1 Return 3. The paths that sum to 8 are: 1. 5 -> 3 2. 5 -> 2 -> 1 3. -3 -> 11
算法解析:
使用树的前缀和,将树已经走过的路径的前缀和存入hashmap里面,当前节点的前缀和 - sum 为 的值,在hashmap中能找到,则找到的数量,为可行解的数量,累加; 同时要初始化 前缀和为0的数量为1,如果当前前缀和为sum时,可以用;
在回溯时,要将前缀和以及hashmap恢复
代码如下:
/**
* 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:
int ans;
unordered_map<int,int> hash;
void dfs(TreeNode* root,int cur,int sum)
{
if(root == NULL) return;
cur += root->val;
//if (hash.find(cur-sum)!=hash.end())
ans += hash[cur-sum];
hash[cur] += 1;
dfs(root->left,cur,sum);
dfs(root->right,cur,sum);
hash[cur] -= 1;
cur -= root->val;
}
int pathSum(TreeNode* root, int sum) {
ans = 0;
hash[0] = 1;
dfs(root,0,sum);
return ans;
}
};