题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
解题思路
首先,只有遍历到叶子结点的路径才称之路径。因此,如果不是叶子结点就要一直遍历到叶子结点才能判断。
为此,我们应将之前遍历到的路径和路径的和保存起来,当遍历到的结点为叶子结点且和为预期值的时候将整条路径输出。
如果为叶子结点和与预期值不一样,则应将叶子结点在路径中删除,然后回退继续查找,直到所有路径都被遍历为止。
代码实现
class Solution{
public:vector<vector<int> > FindPath(TreeNode *root,int expectNumber){
vector <vector <int> > res;
if (!root) return res;
vector <int> tmp;
find(root,expectNumber,tmp,res,0);
return res;
}
void find(TreeNode *root,int expectNum,vector <int> path,
vector<vector<int> > &res,int curr){
curr+=root->val;
path.push_back(root->val);
if(!root->left && !root->right && curr==expectNum)
res.push_back(path);
if(root->left)find(root->left,expectNum,path,res,curr);
if(root->right)find(root->right,expectNum,path,res,curr);
path.pop_back();
}
};
运行时间:2ms
占用内存:376k