437. 路徑總和 III

saulstavo發表於2024-12-10

問題描述

給定一個二叉樹的根節點 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;
    }
};

相關文章