剑指offer:二叉树中和为某一值得路径

题目描述

输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
 
思路: 因为该题是输出符合整数的返回值,所以必定涉及到树的遍历,这里是根节点到各个节点的路径和,于是思考DFS
算法来接,每次递归只要判断当当前的target值是否为零并且左右子树是否全为空(叶子节点),如果满足就加入数组,递归
到最后一个子节点还不满足,则pop_back,当然有可能当前节点值已经满足当还不是叶子节点,这时候任然不满足条件,要继
续递归下去到叶子节点,然后target满足才可以加入数组。
 
代码:
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void find(TreeNode* root, int sum){
        if(root == nullptr) return;
        path.push_back(root -> val);
        sum -= root -> val;
        if(sum == 0 && !root -> left && !root->right) res.push_back(path);
        else{
            if(root -> left) find(root -> left, sum);
            if(root -> right) find(root -> right, sum);
        }
        path.pop_back();
    }
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        find(root, expectNumber);
        return res;
    }
};
原文地址:https://www.cnblogs.com/BillowJ/p/12730235.html