LeetCode 113 Path Sum II

121 阅读1分钟

LeetCode 113 Path Sum II

思路

通过递归至叶子节点,然后再将路径上的节点加起来即可。每次递归,将当前节点的val加入path的最后一个位置,递归结束,将最后一个位置的val弹出。

代码

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        if (!root) return {};
        
        vector<int> path;
        vector<vector<int>> rs;
        
        DFS(root, sum, path, rs);
        
        return rs;
    }
    
    void DFS(TreeNode *root, int sum, vector<int> &path, vector<vector<int>> &rs) {
        if (!root) return ;
        
        path.push_back(root->val);
        DFS(root->left, sum, path, rs);
        DFS(root->right, sum, path, rs);
        
        if (!root->left && !root->right) {
            for (const auto &num : path)
                sum -= num;
            if (!sum) rs.push_back(path);
        }
        path.pop_back();
    }
};

总结

在本题中,由于要算从root至叶子节点的路径和,因此得先找到叶子节点,条件是 !root->left && !root->right ,然后再算路径和,由于要从root开始,则直接将整个path遍历。 在其他题目中,有时候路径的最后一个节点并不是叶子节点,则不需要 !root->left && !root->right 条件。如果路径不一定从root开始,则也不用将整个path遍历完后再做判断,而是一边遍历,一边判断。可见Path Sum III