1. 程式人生 > 實用技巧 >劍指offer(二十四):二叉樹中和為某一值的路徑

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

題目描述

輸入一顆二叉樹的根節點和一個整數,按字典序打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。

思路:中序遞迴遍歷或者先序遞迴遍歷,棧中所存結點為當前結點的所有祖先結點,因此設定一個vector用來儲存當前棧中的結點值,當走到葉子結點時,判斷當前的結點和是否為給定值,彈出結點,每一輪遞迴返回到父結點時,當前路徑也應該回退一個結點

class Solution {
    vector<vector<int> > result;
    vector<int> tmp;
public
: vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { if(root){ tmp.push_back(root->val); if(!root->left && !root->right){ if(sum(tmp) == expectNumber) result.push_back(tmp); } FindPath(root
->left,expectNumber); FindPath(root->right,expectNumber); tmp.pop_back(); } return result; } int sum(vector<int> v){ int sum = 0; for(int i=0;i<v.size();i++){ sum+=v[i]; } return sum; } };

優化:

class Solution {
    vector<vector<int> > result;
    vector<int> tmp;
public:
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        
        if(root){
            tmp.push_back(root->val);
            if(!root->left && !root->right && root->val == expectNumber)
                    result.push_back(tmp);
            FindPath(root->left,expectNumber-root->val);
            FindPath(root->right,expectNumber-root->val);
            tmp.pop_back();
        }
        return result;
    }
    
};