题目
代码(首刷部分看解析)
/**
* 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 pathSum(TreeNode* root, int targetSum) {
if(!root)
return 0;
dfs(root, targetSum, root->val);
pathSum(root->left, targetSum);
pathSum(root->right, targetSum);
return ans;
}
int ans = 0;
void dfs(TreeNode* root, long targetSum, long sum) {
if(targetSum == sum) {
ans++; // 这里不要return
}
if(root->left)
dfs(root->left, targetSum, sum + root->left->val);
if(root->right)
dfs(root->right, targetSum, sum + root->right->val);
}
};
代码(8.4 二刷看解析 GO)
尽管这题的思路是前缀和了,还是要用到dfs的思想在遍历,并且还需要回溯!!!
让我百思不得其解的是,为什么我把count放到全局上面,就会错,我尝试了无数次,最后放到全局,在主函数给他置为0再执行函数,就通过了?!我寻思全局变量初值不就是0吗???
var mp = map[int]int{0: 1}
func pathSum(root *TreeNode, targetSum int) int {
if root == nil {
return 0
}
return preOrder(root, targetSum, 0)
}
func preOrder(root *TreeNode, targetSum int, pre int) int {
if root == nil {
return 0
}
var count int
pre += root.Val
if _, ok := mp[pre-targetSum]; ok {
count += mp[pre - targetSum]
}
mp[pre]++
count += preOrder(root.Left, targetSum, pre)
count += preOrder(root.Right, targetSum, pre)
mp[pre]-- // 回溯
return count
}
代码(8.22 三刷自解)
class Solution {
public:
int dfs(TreeNode *root, long long targetSum) {
if(!root)
return 0;
int res = 0;
if(targetSum == 0)
res++;
if(root->left)
res += dfs(root->left, targetSum-root->left->val);
if(root->right)
res += dfs(root->right, targetSum-root->right->val);
return res;
}
int pathSum(TreeNode* root, int targetSum) {
if(!root)
return 0;
int res = 0;
res += dfs(root, targetSum-root->val);
res += pathSum(root->left, targetSum);
res += pathSum(root->right, targetSum);
return res;
}
};