[劍指 Offer]二叉樹中和爲某一值的路徑
題目描述
輸入一棵二叉樹和一個整數,打印出二叉樹中節點值的和爲輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。
示例:
給定如下二叉樹,以及目標和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
提示:
節點總數 <= 10000
解題思路
- 假設根節點值爲root,從根節點開始找和爲sum的路徑,可以理解爲,從根的左子樹開始找和爲sum-root的路徑,以及從根的右子樹開始找和爲sum-root的路徑。
- 嗯,又是遞歸。
實現代碼
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> res;
vector<int> list;
nextpathSum(root,sum,res,list);
return res;
}
void nextpathSum(TreeNode* root,int sum,vector<vector<int>>& res,vector<int>& list){
if(root==NULL)
return;
list.push_back(root->val);
if(root->val==sum&&root->left==NULL&&root->right==NULL)//符合條件的路徑
res.push_back(list);
vector<int> rlist=list; //因爲參數是傳地址,所以左子樹找完後找右子樹的時候,list裏是有值的
nextpathSum(root->left,sum-root->val,res,list);//左子樹開始找和爲sum-root->val的路徑
nextpathSum(root->right,sum-root->val,res,rlist);//右子樹開始找和爲sum-root->val的路徑
}
};