【mooc上姥姥提供的代码】
#include<cstdio>
#include<stack>
#include<string>
#include<iostream>
using namespace std;
const int maxn=100;
int pre[maxn], in[maxn], post[maxn];
void solve(int PreL, int inL, int postL, int n){
if(n==0)return;
if(n==1){
post[postL]=pre[PreL];
return;
}
int i;
int root=pre[PreL];
post[postL+n-1]=root;
for(i=0; i<n; i++){
if(in[inL+i]==root)break;
}
int L=i, R=n-i-1;
solve(PreL+1, inL, postL, L);
solve(PreL+1+L, inL+L+1, postL+L, R);
}
int main(){
int n, num, i=0, j=0;
scanf("%d", &n);
string s;
stack<int> st;
for(int z=0; z<2*n; z++){
cin>>s;
if(s=="Push"){
scanf("%d\n", &num);
st.push(num);
pre[i++]=num;
}else{
num=st.top();
st.pop();
in[j++]=num;
}
}
solve(0,0,0,n);
for(int i=0; i<n; i++){
printf("%d", post[i]);
if(i!=n-1)printf(" ");
}
return 0;
}
【自己的】大致思路:根据已知条件构建树,构建完成后,采用后序递归遍历树
#include<cstdio>
#include<stack>
#include<string>
#include<iostream>
const int maxn=35;
using namespace std;
struct TNode{
int left, right;
}T[maxn];
int count=0, n;
void print(int root){
if(root==-1)return ;
if(T[root].left!=-1)print(T[root].left);
if(T[root].right!=-1)print(T[root].right);
count++;
printf("%d", root);
if(count<n/2)printf(" ");
}
int main(){
int num, cnt=0, temp, root, flag=0, first;
scanf("%d\n", &n);
for(int i=1; i<=n; i++){//注意题目说角标是从1开始的
T[i].left=-1;
T[i].right=-1;
}
n=n*2;
string s;
stack<int> st;
for(int i=0; i<n; i++){
cin>>s;
if(s=="Push"){
cin>>num;
st.push(num);
if(i==0){
root=num;
first=num;
}else{
if(flag==0)T[root].left=num;
else T[root].right=num;
root=num;
flag=0;
}
}else{
root=st.top();
st.pop();
flag=1;
}
}
print(first);
return 0;
}