题目:
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
给定一个二叉树,和一个和,找出所有的路径,要求路径上的数字的和等于sum。
For example:Given the below binary tree and
sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
return
[ [5,4,11,2], [5,8,4,5] ]思路:
与Path Sum:http://blog.csdn.net/u012243115/article/details/40867147 相比,本题是求出路径,所以,在找到满足的路径之后,不能直接返回,而是将其添加到一个vector<vector<int>>中。在查找的过程中,每经过一个结点,先使用一个vector<int>将该路径中的所有结点记录下来。由于vector<vector<int>>是用来记录所有满足的路径的,所以传递引用给它是为了对它的每一个改动都是对其本身的操作,而不是对其副本的操作,使用它来返回找到的所有路径。使用的vector<int>只是拷贝操作,所以都是对其副本的操作,不会对原始的vector<int>有影响。
代码:
class Solution
{
public:
vector<vector<int> > pathSum(TreeNode *root, int sum)
{
vector<vector<int> > result;//结果
vector<int> curPath;//临时存储路径
pathSum(root,sum,result,curPath);//
return result;
}
void pathSum(TreeNode *root , int sum ,vector<vector<int> > &result ,vector<int> curPath )
{
if(root == NULL)
return ; //递归结束条件
curPath.push_back(root->val);
//如果叶结点的值与当前的sum相等,则是正确的路径
if(root->val == sum && root->left == NULL && root->right == NULL)
{
result.push_back(curPath);
}
if(root->left != NULL)
pathSum(root->left,sum - root->val , result , curPath);
if(root->right != NULL)
pathSum(root->right,sum - root->val , result , curPath);
}
};