#include <cstdio>
#include <stack>
#include <cstring>
#include <cstdlib>
using namespace std;
int pre[1000];
int in[1000];
int t = 0;
int n;
typedef struct Node{
int data;
Node *lchild, *rchild;
}Node, *BiTree;
void create(BiTree &T, int preL, int preR, int inL, int inR){
if(preL > preR) return;
T = (BiTree)malloc(sizeof(BiTree));
T->lchild = NULL; T->rchild = NULL;
T->data = pre[preL];
int k;
for(k=inL; k<=inR; k++){
if(in[k] == pre[preL]) break;
}
int numleft = k - inL;
create(T->lchild, preL+1, preL+numleft, inL, k-1);
create(T->rchild, preL+numleft+1, preR, k+1, inR);
}
void postorder(BiTree T){
if(T == NULL) return;
postorder(T->lchild);
postorder(T->rchild);
printf("%d", T->data);
t++;
if(t != n){
printf(" ");
}
}
int main(){
scanf("%d", &n);
char str[10];
stack<int> st;
int temp;
int num1 = 0;
int num2 = 0;
for(int i=0; i<2*n; i++){
scanf("%s", str);
if(strcmp(str, "Push")==0){
scanf("%d", &temp);
st.push(temp);
pre[num1] = temp;
num1++;
}else{
in[num2] = st.top();
num2++;
st.pop();
}
}
BiTree T;
create(T, 0, n-1, 0, n-1);
postorder(T);
return 0;
}
由题意可以推断出,入栈的次序即是先序遍历的顺序,出栈的次序即是中序遍历的顺序。因此可以得到中序和先序两个序列,然后通过这两个序列构建二叉树,然后再通过后序遍历输出二叉树即可。