给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
返回:
[ [5,4,11,2], [5,8,4,5] ]
思路:递归搜索每条路径,用cnt相加每个节点上的值,用一个vector数组,来模拟栈,依次将节点加入,当cnt==sum时,
将这条路径加入res中,同时,将上一条路径的后一个节点出栈,即vec.pop_back()
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int> > res;
vector<int> vec;
int cnt = 0;
generate(root,cnt,sum,vec,res);
return res;
}
private:
void generate(TreeNode *node,int &cnt,int sum,
vector<int> &vec,
vector<vector<int> > &res)
{
if(!node)
return;
cnt+=node->val;
vec.push_back(node->val);
if(!node->left&&!node->right&&cnt==sum){
res.push_back(vec);
}
generate(node->left,cnt,sum,vec,res);
generate(node->right,cnt,sum,vec,res);
vec.pop_back();
cnt-=node->val;
}
};