天天看點

劍指offer:二叉樹中和為某一值的路徑

題目描述:

輸入一顆二叉樹的根節點和一個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在傳回值的list中,數組長度大的數組靠前)

解題思路:

樹的題直接想到用遞歸求解,由于需要數組長度大的考前,用dfs。同時注意,對于不滿足的情況,需要回溯。

代碼:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    void FindPathCore(vector<vector<int>> &res, TreeNode* cur, vector<int>& tmp, int expectNumber, int& sum)
    {
        if(cur==nullptr)
            return;
        if(cur->left==nullptr && cur->right==nullptr && sum+cur->val==expectNumber)
        {
            tmp.push_back(cur->val);
            res.push_back(tmp);
            tmp.pop_back();
            return;
        }
        sum = sum+cur->val;
        tmp.push_back(cur->val);
        FindPathCore(res, cur->left, tmp, expectNumber, sum);
        FindPathCore(res, cur->right, tmp, expectNumber, sum);
        tmp.pop_back();
        sum = sum-cur->val;
    }
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        vector<vector<int>>res;
        if(root==nullptr)
            return res;
        int sum = 0;
        vector<int> tmp;
        FindPathCore(res, root, tmp, expectNumber, sum);
        return res;
    }
};