题目:输入一棵二叉树和一个整数。打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点成为一条路径。
这题开始用堆栈来做,我也不知道自己写的什么鬼。后来还是用递归来做,代码如下:
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> numVect;
vector<vector<int> > vectSet;
if(root==NULL)
return vectSet;
FindPath(root,expectNumber,numVect,vectSet);
return vectSet;
}
void FindPath(TreeNode* root,int expectNumber,vector<int> &numVect,vector<vector<int> > &vectSet)
{
TreeNode *curNode=root;
if(curNode->left==NULL&&curNode->right==NULL)
{
if(curNode->val==expectNumber)
{
numVect.push_back(curNode->val);
vectSet.push_back(numVect);
numVect.pop_back();
return;
}
}
else
{
numVect.push_back(curNode->val);
if(curNode->left)
FindPath(root->left,expectNumber-curNode->val,numVect,vectSet);
if(curNode->right)
FindPath(root->right,expectNumber-curNode->val,numVect,vectSet);
numVect.pop_back();
}
}
};
同时将原来用stack写的代码记录下,注意,
该代码是错误的,但是我不会修改,先记录下,哪位大神路过教修改下。
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<int> numVect;
vector<vector<int> > vectSet;
if(root==NULL)
return vectSet;
TreeNode *curNode=root;
stack<TreeNode *> nodeStack;
nodeStack.push(curNode);
while(!nodeStack.empty())
{
curNode=nodeStack.top();
nodeStack.pop();
if(curNode->left==NULL&&curNode->right==NULL)
{
if(curNode->val==expectNumber)
{
numVect.push_back(curNode->val);
vectSet.push_back(numVect);
numVect.pop_back();
}
}
else
{
numVect.push_back(curNode->val);
expectNumber-=curNode->val;
if(curNode->right)
nodeStack.push(curNode->right);
if(curNode->left)
nodeStack.push(curNode->left);
// expectNumber+=curNode->val;
// numVect.pop_back();
}
}
return vectSet;
}
};