113.路径总和II

leetcode中等难度,先开始没有看清题目描述导致后面调试了很久,后面才发现是一个判断语句出了问题,以后在边界条件上多加注意才是。

题目描述:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

分析

针对所有问题,做题之前我们应该先要分析题目类型然后我们才能确定后面使用的方法框架。本题很典型的二叉树结构,那这里我们首先应该想到还是如何进行二叉树的遍历以及剪枝等等的思路技巧;接下来,考虑到要写出所有符合条件的路径,那这里我大体的思路框架就确定在了搜索回溯那一套;详细的如下所示:

class Solution {
    vector<vector<int> > res;
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
//        int my_sum = 0;
        if(!root)
            return res;
        vector<int> ve;
        sum -= root->val;
        //
        // if(sum == 0){
        //     if((root->left == NULL) && (root->right == NULL)){
        //         ve.push_back(root->val);
        //         res.push_back(ve);
                
        //     }
        //     return res;
        // }
        ve.push_back(root->val);
        backtrack(sum, ve, root);
        return res;
    }
    void backtrack(int sum, vector<int>& ve, TreeNode* node){
        // if(sum<0) return;
        if((sum == 0) && (node->left == NULL) && (node->right == NULL)){
            res.push_back(ve);
            return;
        }


        if(node->left){
            ve.push_back(node->left->val);
            sum -= node->left->val;
            backtrack(sum, ve, node->left);
            ve.pop_back();
            sum += node->left->val;
        }
        if(node->right){
            ve.push_back(node->right->val);
            sum -= node->right->val;
            backtrack(sum, ve, node->right);
            ve.pop_back();
            sum += node->right->val;
        }
        return;
    }
};

在线测试一下,结果还不错,时间击败92%,内存击败98%。第一遍先想着快速ac出来,后续再仔细想想如何进行优化。

posted @ 2020-09-29 23:40  青衣素  阅读(133)  评论(0)    收藏  举报