class Solution {
public:
//用全局变量进行绑定元素这样避免了在函数中进行参数的传递,会稍微简单一些,
vector<int> pre;
vector<int> in;
TreeNode*build(int st1, int ed1, int st2, int ed2)
{
//边界条件判断 自己手动画一画,
if(st1 > ed1) // st1-ed1== 1 这样也是可以通过的,自己画一下就看出来了边界条件
{
//cout << "st1 > ed1 || st2 > ed2"<< endl;
return NULL;
}
//要用堆上的空间,不要用栈上的空间
TreeNode * r = new TreeNode(pre[st1]);
// 如果就一个元素就直接返回就行了,其实不写也行,因为下面的递归也已经包含了
if(st1 == ed1)
{
//cout<< "st1 == ed1"<< endl;
return r;
}
int find= -1;
//[]用的是比区间,不要左闭右开写惯了,会有bug
for(int i=st2; i<=ed2; ++i)
{
if(in[i] == r->val)
{
find = i;
break;
}
}
if(find == -1)
return -1;
int c = find - st2;
r->left = build(st1+1, st1+c, st2, find-1);
r->right = build(st1+c+1, ed1, find+1, ed2);
return r;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
pre = preorder;
in = inorder;
TreeNode* r = build(0,pre.size()-1, 0, in.size()-1);
return r;
}
};
class Solution {
public:
vector<int> ans;
// 递归代码
/*
void previsit(TreeNode* r)
{
if(r != NULL)
{
ans.push_back(r->val);
previsit(r->left);
previsit(r->right);
}
}*/
// 非递归代码
void previsit(TreeNode* r)
{
stack<TreeNode*> s;
s.push(r);
while(!s.empty())
{
r= s.top();
s.pop();
if(r!=NULL)
{
ans.push_back(r->val);
s.push(r->right);
s.push(r->left);
}
}
}
vector<int> preorderTraversal(TreeNode* root) {
ans.clear();
previsit(root);
return ans;
}
};