剑指offer-二叉树中和为某一值的路径(中等)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

回溯 和求某节点到根节点的路径差不多
只是这里找到符合条件的叶节点时,遍历继续走完就好

//======================================利用sum函数求和,看是否符合条件 
class Solution {
public:
    vector<vector<int>> ans;
    vector<int> temp; 
    vector<vector<int>> pathSum(TreeNode* root, int target) {
        dfs(root, target);
        return ans;
    }
    void dfs(TreeNode* root, int target) {
        if (!root) return;
        temp.push_back(root->val);
        if (sum(temp) == target && !root->left && !root->right) {//和为target且为叶子结点时才对
            ans.push_back(temp);
        }
        dfs(root->left, target);
        dfs(root->right, target);
        temp.pop_back();
    }
    int sum(vector<int> a) {
        int s = 0;
        for (auto i : a)
            s += i;
        return s;
    }
};

//-----------------------------------改进:push的时候sum+=,pop的时候sum-=

    class Solution {
    public:
        vector<vector<int>> ans;
        vector<int> temp;
        int sum = 0;
        vector<vector<int>> pathSum(TreeNode* root, int target) {
            dfs(root, target);
            return ans;
        }
        void dfs(TreeNode* root, int target) {
            if (!root) return;
            temp.push_back(root->val);
            sum += root->val;//这里改了但是效率提升不少
            if (sum == target && !root->left && !root->right) {//和为target且为叶子结点时才对
                ans.push_back(temp);
            }
            dfs(root->left, target);
            dfs(root->right, target);
            temp.pop_back();
            sum -= root->val;
        }
};
全部评论

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
10-11 17:30
湖南大学 C++
我已成为0offer的糕手:羡慕
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务