题目中push的顺序为先根遍历,pop()得到的结果为后根遍历,因此这个题是根据先根遍历和中根遍历来求后根遍历。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define ll long long
#define inf 999999999
using namespace std;
vector<int> v;
int a[35];
int b[35];
int c[35];
int num3=0;
void f(int pre,int in,int n) //n为该树结点数目,pre为先根遍历的位置,in为中根遍历的位置。
{
if(n==0)
return;
int root=a[pre];
int mark;
for(int i=0;i<n;i++)
{
if(b[in+i]==root)
{
mark=i;
break;
}
}
int l=mark; //左子树个数
int r=n-l-1; //右子数个数。
f(pre+1,in,l); //后根遍历左子树
f(pre+l+1,in+l+1,r); //后根遍历右子树
c[num3++]=root; //最后遍历根点。
}
int main()
{
int n;
scanf("%d",&n);
int num1=0;
int num2=0;
for(int i=0;i<2*n;i++)
{
char s[10];
scanf("%s",s);
if(s[1]=='u')
{
int d;
scanf("%d",&d);
v.push_back(d);
a[num1++]=d;
}
else
{
b[num2++]=v.back();
v.pop_back();
}
}
f(0,0,n);
for(int i=0;i<num3;i++)
{
if(i!=num3-1)
printf("%d ",c[i]);
else
{
printf("%d",c[i]);
}
}
}