解题思路:对当根节点进行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);
}
};
本文探讨了二叉树中寻找所有路径使得路径上节点值之和等于特定值的问题。通过对DFS深度优先搜索的改进,实现了高效求解,并提供了一种优化方案来处理路径上的多个子路径满足条件的情况。
297

被折叠的 条评论
为什么被折叠?



