root
,和一个整数 targetSum
,求该二叉树里节点值之和等于 targetSum
的路径的数目。
root
与目标值 target
作为参数,不断在递归过程中向下更新 target
(也就是 target -= root->val
),当在某个节点处 target
更新为 0
,则结果计数器加一。target
传递给下一层外部递归(也就是说,外部递归就是遍历每一个节点,将 target
传给每一个节点),同时对当前节点进行内部递归,内部递归得出的计数器结果与左右子返回的结果相加即可。target
。prefix
保存前缀和出现的次数,在当前节点,前缀为 cur
,则进入子节点递归前 ++prefix[cur]
(更新哈希表后进入递归),递归结束后当前函数返回前 --prefix[cur]
(回溯到原来状态)。class Solution
{
private:
int ans = 0;
void dfs(TreeNode* root, int target)
{
if(!root) return;
target -= root->val;
if(target == 0) ++ans;
dfs(root->left, target);
dfs(root->right, target);
}
public:
int pathSum(TreeNode* root, int targetSum)
{
ans = 0;
if(!root) return ans;
dfs(root, targetSum);
return ans + pathSum(root->left, targetSum) + pathSum(root->right, targetSum);
}
};
class Solution {
public:
unordered_map<long long, int> prefix;
int dfs(TreeNode *root, long long curr, int targetSum) {
if (!root) {
return 0;
}
int ret = 0;
curr += root->val;
if (prefix.count(curr - targetSum)) {
ret = prefix[curr - targetSum];
}
prefix[curr]++;
ret += dfs(root->left, curr, targetSum);
ret += dfs(root->right, curr, targetSum);
prefix[curr]--; // 回溯
return ret;
}
int pathSum(TreeNode* root, int targetSum) {
prefix[0] = 1; // 注意要把空集的次数放入
return dfs(root, 0, targetSum);
}
};