Push序列:相当于先序遍历序列pre
Pop序列:相当于中序遍历序列in
根据两序列还原二叉树
#include <iostream>
#include <stack>
#include <vector>
#include <math.h>
using namespace std;
stack<int> s;
vector<int> pre,in;
int flag_postOrder=0;
void buildT(int prel,int prer,int inl,int inr){
if(prel>prer) return;
int inRoot=inl;
while(in[inRoot]!=pre[prel]) inRoot++;
buildT(prel+1,prel+(inRoot-inl),inl,inRoot-1);
buildT(prel+(inRoot-inl)+1,prer,inRoot+1,inr);
printf("%s%d",flag_postOrder==1?" ":"",pre[prel]);
flag_postOrder=1;
}
int main(){
int n,t;
scanf("%d",&n);
string tmp_order;
pre.push_back(-1),in.push_back(-1);//让其下标从1开始
for(int i=0;i<2*n;i++){
cin>>tmp_order;
if(tmp_order=="Push"){
cin>>t;
s.push(t);
pre.push_back(t);
}else if(tmp_order=="Pop"){
t=s.top();
s.pop();
in.push_back(t);
}
}
buildT(1,n,1,n);
return 0;
}