入栈的顺序是先序访问顺序,出栈的顺序是中序访问顺序
#include <iostream>
#include <stack>
#include <string>
#include <stdio.h>
using namespace std;
int n;
bool first = true;
int *preorder;
int *inorder;
struct Info
{
int value;
Info *left;
Info *right;
};
int findIn(int element, int start, int end)
{
for(int i = start; i <= end; i++)
{
if(inorder[i] == element)
return i-start;
}
return -1;
}
void build(Info *tree, int prestart, int preend, int instart, int inend)
{
int root = preorder[prestart];
tree->value = root;
if(instart == inend)
{
tree->left = NULL;
tree->right = NULL;
return;
}
int site = findIn(root, instart, inend);
if(site == 0)
tree->left = NULL;
else
{
tree->left = new Info;
build(tree->left, prestart+1, prestart + site, instart, instart + site-1);
}
if(site == inend-instart)
tree->right = NULL;
else
{
tree->right = new Info;
build(tree->right, prestart + site+1, preend, instart + site + 1, inend);
}
}
void postoutput(Info *tree)
{
if(tree == NULL)
return ;
postoutput(tree->left);
postoutput(tree->right);
if(first)
cout << tree->value;
else
cout << " " << tree->value;
first = false;
}
int main()
{
stack<int> instack;
string op;
int x;
int j = 0;
int t = 0;
cin >> n;
preorder = new int[n];
inorder = new int[n];
for(int i = 0; i < 2*n; i++)
{
cin >> op;
if(op == "Push")
{
cin >> x;
instack.push(x);
preorder[j++] = x;
}
else
{
inorder[t++] = instack.top();
instack.pop();
}
}
Info tree;
build(&tree,0, n-1, 0, n-1);
postoutput(&tree);
return 0;
}