题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
示例1
输入
{10,5,12,4,7},22
返回值
[[10,5,7],[10,12]]
示例2
输入
{10,5,12,4,7},15
返回值
[]
通常这种要找到满足条件的所有路径,就是采用回溯的方法。且应该用深搜而不是广搜。
回溯的代码编写主要注意好 结束边界,搜索条件,搜索方式等就好,多做几道题都会是类似套路。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<vector<int> >ans;
vector<int>tmp;
void fin(TreeNode* root,int sum,int x)
{
if(root->left==NULL&&root->right==NULL)
{
if(sum+root->val==x)
{
tmp.push_back(root->val);
ans.push_back(tmp);
tmp.pop_back();
}
return;
}
if(root->left)
{
tmp.push_back(root->val);
fin(root->left,sum+root->val,x);
tmp.pop_back();
}
if(root->right)
{
tmp.push_back(root->val);
fin(root->right,sum+root->val,x);
tmp.pop_back();
}
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if(root==NULL) return ans;
fin(root,0,expectNumber);
return ans;
}
};