《从头再来》剑指offer.34 二叉树中和为某一值的路径

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

 这是一个典型的dfs的题目,也就是说我们以一条路走到黑来判断。每遇到一个节点,就判断将该节点加入后和target的差距还有多少。

递归返回的条件为节点为空。当然,如果走到根结点,并且加上该根结点的值就等于target,那么就将路径加入结果中,并且返回。无论在什么时候返回,返回前一定要将前一个节点弹出队列。

/**
 * 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) {}
 * };
 */
class Solution {
public:
    void dfs(TreeNode* root, int target, vector<int>& path){
        if(root == nullptr) return;
        target -= root->val;
        path.push_back(root->val);
        if(target == 0 && root->left == nullptr && root->right == nullptr){
            result.push_back(path);
            path.pop_back();//pop的时候,一定是没有值的!!!
            return;
        }

        dfs(root->left,target,path);
        dfs(root->right,target,path);

        path.pop_back();//到底在返回前为什么要弹出呢???
        //因为该节点的值加上后和target不相等(还使用了当前节点的子节点),所以需要pop后,再找另一个值
        return;

    }

    vector<vector<int>> result;
    vector<vector<int>> pathSum(TreeNode* root, int target) {
        vector<int> path;
        dfs(root,target,path);

        return result;
    }
};

《从头再来》

posted @ 2021-06-07 21:09  丶原来是枝知啊i  阅读(65)  评论(0)    收藏  举报