纯粹的搜索回溯
反思这次错误:
血的教训!!!写函数的的时候一定要记得自己想要获得结果是不是传引用啊!!!还有判断参数合法性,如果函数是需要返回一个结果的, 不合法也要返回一个值!!!!比如这道题的FindPath函数的参数TreeNode * root,如果root==nullptr,也要返回一个结果res!!!不然程序提交一直报段错误!!
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> > FindPath(TreeNode* root,int expectNumber)
{
vector<int>path;
vector<vector<int> >res;
if(root == nullptr)//树是空树,直接返回!没有这个会报段错误
return res;
path.push_back (root ->val);//将根节点加入路径
getPath(root, expectNumber, root->val, path, res);
return res;
}
//参数root表示当前走到了root节点,nownum表示当前获得值,path储存路径,res储存符合要求的路径
//血的教训,参数 res 一定要引用啊!!!
void getPath(TreeNode * root, int expectNumber, int nownum, vector<int> & path, vector<vector<int> > & res )
{
if(root -> left == nullptr && root->right == nullptr)//走到叶子节点
{
if(nownum == expectNumber) //到叶子节点并且符合要求
res.push_back (path);
return ;
}
if(root ->left)//左子树没走过就走
{
path.push_back (root->left->val);
nownum += root->left->val;
getPath(root->left, expectNumber, nownum, path, res);
//回溯
path.pop_back ();//vector的函数,弹出路径末尾顶点
nownum -= root->left->val;
}
if(root ->right)//同上
{
path.push_back (root->right->val);
nownum += root->right->val;
getPath(root->right, expectNumber, nownum, path, res);
path.pop_back ();
nownum -= root->right->val;
}
}
};