問題描述
給定一個二叉樹的根節點 root ,和一個整數 targetSum ,求該二叉樹裡節點值之和等於 targetSum 的 路徑 的數目。
路徑 不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。
分析
暴力解法,列舉每個結點開始是否有符合題意的路徑,需要dfs列舉起點,從起點開始列舉路徑還是dfs,所以是兩層dfs。值得注意的是,因為題目中有負數,限制了剪枝:
- 噹噹前路徑結點和大於target時,不能return,因為下一個結點可能是負數,會使得當前路徑和再減小
- 當找到res時,不能return,因為下一個結點可能是1,再下一個結點可能是-1,於是還有答案
法一、暴力列舉,兩次遞迴
class Solution {
public:
long long res = 0;
int target_sum = 0;
// 從當前結點開始尋找答案路徑
void solve(TreeNode* root, long long x) {
if (root == nullptr) {
return ;
}
x += root->val;
// if (x > target_sum) {
// return ;
// }
if (x == target_sum) {
res++;
// return ;
}
solve(root->left, x);
solve(root->right, x);
}
void dfs(TreeNode* root) {
if (root == nullptr) {
return ;
}
solve(root, 0);
dfs(root->left);
dfs(root->right);
}
int pathSum(TreeNode* root, int targetSum) {
this->target_sum = targetSum;
dfs(root);
return res;
}
};