437. 路径总和 III
第一种方法:递归的方式,即将每个点都看成是根节点,看满足条件的个数。
时间和空间复杂度为 N 2 N^2 N2 N N N
int ans = 0;
int rootSum(TreeNode* root,int targetSum){
if(root == nullptr)
return 0;
int ret = 0;
if(root -> val == targetSum)
ret ++;
ret += rootSum(root->left, targetSum - root->val);
ret += rootSum(root->right, targetSum - root->val);
return ret;
}
int pathSum(TreeNode* root, int targetSum) {
if(!root)
return 0;
int ret = rootSum(root, targetSum);
ret += pathSum(root->left, targetSum);
ret += pathSum(root->right, targetSum);
return ret;
}
第二种是前缀和的方法,一次使用map记录前缀和的个数,通过map查看curr-targetsum的个数,如存在,则说明最近的若干个节点的和等于targetsum的值,结果+上map[curr-targetsum]的个数。
unordered_map<int, int> prefix;
int dfs(TreeNode* root, long long curr, int targetSum){
if(root == nullptr)
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);
}