题目大意:通过栈来构建二叉树
解题思路:每一个push之后的数字构成的序列是树的前序遍历序列。如果将这些数字将构成一个栈,每次从栈中pop出的数组成树的中序遍历序列。所以这道题就是根据前序和中序构建后序序列并输出
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
vector<int> v1,v2,ans;
int n;
void postorder(int prel,int inl,int inr){
if (inl>inr){
return;
}
int i;
for (i=inl;i<=inr;i++){
if (v1[prel]==v2[i]){
break;
}
}
postorder(prel+1,inl,i-1);
postorder(prel+i-inl+1,i+1,inr);
ans.push_back(v2[i]);
}
int main(){
int t;
scanf("%d\n",&n);
string s;
stack<int> tque;
for (int i=0;i<2*n;i++){
getline(cin,s);
if (s[1]=='u'){
s=s.substr(5);
t=stoi(s);
v1.push_back(t);
tque.push(t);
}
else if(s[1]=='o'){
v2.push_back(tque.top());
tque.pop();
}
}
postorder(0,0,n-1);
for (int i=0;i<ans.size();i++){
if (i!=0){
printf(" ");
}
printf("%d",ans[i]);
}
return 0;
}