解题思路:对当根节点进行dfs,使用类似于112-Path Sum的方法自顶向下遍历根节点的孩子节点,一旦发现满足条件就返回,不再向下遍历。但是这种思路只能通过部分测试样例。(116 / 126 test cases passed.)
Input:
[1,-2,-3,1,3,-2,null,-1]-1
Output:
3
class Solution {
public:
int getpath(TreeNode *root,int sum){
if(!root) return 0;
if(root->val == sum) return 1;
if(!root->left && !root->right) return 0;
return getpath(root->left,sum-root->val)+getpath(root->right,sum-root->val);
}
void preorder(TreeNode *root,int &sum,int &cnt){
cnt += getpath(root,sum);
if(root->left)
preorder(root->left,sum,cnt);
if(root->right)
preorder(root->right,sum,cnt);
}
int pathSum(TreeNode* root, int sum) {
if(!root) return 0;
int cnt = 0;
preorder(root,sum,cnt);
return cnt;
}
};
解题思路:后来发现未通过得测试用例可能包含一条路径上有多个满足条件的子路径的情况。修改getPath代码如下:
int getpath(TreeNode *root,int sum){
int cnt = 0;
if(!root) return cnt;
if(root->val == sum) cnt++;
if(root->left)
cnt += getpath(root->left,sum-root->val);
if(root->right)
cnt += getpath(root->right,sum-root->val);
return cnt;
}
进一步优化:
class Solution {
public:
int getpath(TreeNode *root,int sum){
int cnt = 0;
if(!root) return cnt;
if(root->val == sum) cnt++;
if(root->left)
cnt += getpath(root->left,sum-root->val);
if(root->right)
cnt += getpath(root->right,sum-root->val);
return cnt;
}
int pathSum(TreeNode* root, int sum) {
if(!root) return 0;
return getpath(root,sum)+pathSum(root->left,sum)+pathSum(root->right,sum);
}
};