題目描述
輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
解題思路
要求一路徑的和,那么必然終止條件為葉子結點,從根結點出發,從左往右,每條路徑的和都與給定的值比較,自然能求出。
但往往二叉樹的題,都會用到遞歸,本身是二叉樹,那么子樹必定為二叉樹,如果找到規律??
我們可以這樣想,遞歸一次,舊調用系統棧一次保存數據。既然要路徑上的所有結點的和等于給定的值,就說明給定的值減去路徑的和等于0。我們就不難想到,每次遞歸減去當前根結點的值,一直到葉子結點,如果最后的值等于葉子結點的值那不就正好可以求解此題。
我們要考慮特殊情況,如果二叉樹只有一個結點,并恰巧那個結點的值等于給定的值呢??所以,每回減去當前根結點的值前,先判斷是否相等,再減去。
如果到葉子結點不相等,那么就往上走,再往右邊走。
有了上述思路,就不難寫出如下代碼
代碼實現
class Solution {vector<vector<int>> result;vector<int> path;
public:void find(TreeNode* root,int expectnum){if(root == NULL)return ;path.push_back(root->val);if(!root->left&&!root->right&& expectnum == root->val)result.push_back(path);else{if(root->left)find(root->left,expectnum-root->val);if(root->right)find(root->right,expectnum-root->val);}path.pop_back();}vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {find(root,expectNumber);return result;}
};