基本思想:
暴力太过暴力;
利用前缀和做;
前缀和具体思想:
维持一个递增序列,并且n u m s [ j ] − n u m s [ i ] nums[j]-nums[i]nums[j]−nums[i]即为i~j的和;
从根到叶维护一个前缀和map,每次查,cur-targetSum是否在map中;
值得注意的是,可能有多个符合标准的前缀和,此时说明有多条路径满足,这一点注意一下;
因此根结点必须要设置为map[0]=1;
基本代码:
1.暴力搜索:
/**
* 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:
void dfs(TreeNode* root,int sum,int targetsum){
if(root==nullptr){
return;
}
if(targetsum==sum+root->val){
cnt++;
}
dfs(root->left,sum+root->val,targetsum);
dfs(root->right,sum+root->val,targetsum);
}
void mdfs(TreeNode* root,int targetsum){
if(root==nullptr)
return;
dfs(root,0,targetsum);
mdfs(root->left,targetsum);
mdfs(root->right,targetsum);
}
int pathSum(TreeNode* root, int targetSum) {
mdfs(root,targetSum);
return cnt;
}
private:
int cnt=0;
};
2.前缀和:
/**
* 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 dfs(TreeNode* root,int cur,int targetsum){
if(root==nullptr){
return 0;
}
cur+=root->val;
int cnt=0;
if(mp[cur-targetsum]!=0){
cnt+=mp[cur-targetsum];
}
mp[cur]+=1;
cnt+=dfs(root->left,cur,targetsum);
cnt+=dfs(root->right,cur,targetsum);
mp[cur]--;
return cnt;
}
int pathSum(TreeNode* root, int targetSum) {
if(root==nullptr)
return 0;
mp[0]=1;
int cnt=dfs(root,0,targetSum);
return cnt;
}
private:
map<int,int>mp;
};
版权声明:本文为m0_66776925原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。