标签:class 执行 set 回溯 pop 使用 数组 判断 传值
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: void helper(vector<vector<int> > &result,vector<int> &tmp,TreeNode* root,int expectNumber){ if(root == nullptr){ return; } expectNumber = expectNumber - root->val; tmp.push_back(root -> val); if(root -> left == nullptr && root -> right == nullptr){//必须叶子节点才返回 if(expectNumber == 0){ result.push_back(tmp); tmp.pop_back(); return; } else{ tmp.pop_back(); return; } } helper(result,tmp,root -> left,expectNumber); helper(result,tmp,root -> right,expectNumber); tmp.pop_back(); } vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { vector<vector<int> > result; vector<int> tmp; if(root == nullptr){ return result; } helper(result,tmp,root,expectNumber); return result; } };
其实就是每次return要修改一个共有的东西,push_back了,下次递归之前就必须pop_back.这里就因为有return要终止程序了,而前面有一个push_back的操作,所有后面需要pop_back。
可以这么修改:
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: void helper(vector<vector<int> > &result,vector<int> &tmp,TreeNode* root,int expectNumber){ if(root == nullptr){ return; } expectNumber = expectNumber - root->val; tmp.push_back(root -> val); if(expectNumber == 0 && root -> left == nullptr && root -> right == nullptr){//必须叶子节点才返回 result.push_back(tmp); } helper(result,tmp,root -> left,expectNumber); helper(result,tmp,root -> right,expectNumber); tmp.pop_back(); } vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { vector<vector<int> > result; vector<int> tmp; if(root == nullptr){ return result; } helper(result,tmp,root,expectNumber); return result; } };
可以联想其他的回溯法的题目,比如permtation,subsets这些问题都可以
下面一个程序是牛客上的某个答案,为什么没有明显的递归基也可以呢?
因为左右节点有判断是否为空,如果都为空那么整个程序就会顺序执行完毕,整个程序就终止了,这也是一种递归基。
class Solution { vector<vector<int> >allRes; vector<int> tmp; void dfsFind(TreeNode * node , int left){ tmp.push_back(node->val); if(left-node->val == 0 && !node->left && !node->right) allRes.push_back(tmp); else { if(node->left) dfsFind(node->left, left-node->val); if(node->right) dfsFind(node->right, left-node->val); } tmp.pop_back(); } public: vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { if(root) dfsFind(root, expectNumber); return allRes; } };
标签:class 执行 set 回溯 pop 使用 数组 判断 传值
原文地址:http://www.cnblogs.com/dingxiaoqiang/p/8001539.html