for(int i=inl;i<inr;i++)//应为i<=inr,找半天。。
#include<iostream>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
const int MAX = 50;
stack<int> s;
vector<int> post;
int pre[MAX],in[MAX];
void creatpostorder(int prel,int prer,int inl,int inr){
if(inl>inr) return;
int k;
for(int i=inl;i<=inr;i++){
if(in[i]==pre[prel]){
k=i;
}
}
int leftnum=k-inl;
if(inl==k-1){
post.push_back(in[k-1]);
}
else if(inl<k-1){
creatpostorder(prel+1,prel+leftnum,inl,inl+leftnum-1);
}
int rightnum=inr-k;
if(inr==k+1){
post.push_back(in[k+1]);
}
else if(k+1<inr){
creatpostorder(prer-rightnum+1,prer,inr-rightnum+1,inr);
}
post.push_back(in[k]);
}
int main(){
int n;
cin>>n;
int j=0,p=0;
for(int i=0;i<n*2;i++){
string temp;
int data;
cin>>temp;
if(temp=="Push"){
cin>>data;
pre[j++]=data;
s.push(data);
}else if(temp=="Pop"){
in[p++]=s.top();
s.pop();
}
}
creatpostorder(0,n-1,0,n-1);
for(int i=0;i<n;i++){
if(i!=0) printf(" ");
printf("%d",post[i]);
}
}
建好二叉树:
#include<iostream>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
const int MAX = 50;
struct node{
int data;
node* lchild;
node* rchild;
};
stack<int> s;
vector<int> post;
int pre[MAX],in[MAX];
node* create(int prel,int prer,int inl,int inr){
if(prel>prer) return NULL;
node* root=new node;
root->data=pre[prel];
int k;
for(int i=inl;i<=inr;i++){
if(in[i]==pre[prel]){
k=i;break;
}
}
int leftnum=k-inl;
root->lchild=create(prel+1,prel+leftnum,inl,k-1);
root->rchild=create(prel+leftnum+1,prer,k+1,inr);
return root;
}
void postorder(node* root){
if(root==NULL) return ;
postorder(root->lchild);
postorder(root->rchild);
post.push_back(root->data);
}
int main(){
int n;
cin>>n;
int j=0,p=0;
for(int i=0;i<n*2;i++){
string temp;
int data;
cin>>temp;
if(temp=="Push"){
cin>>data;
pre[j++]=data;
s.push(data);
}else if(temp=="Pop"){
in[p++]=s.top();
s.pop();
}
}
node* root=create(0,n-1,0,n-1);
postorder(root);
for(int i=0;i<n;i++){
if(i!=0) printf(" ");
printf("%d",post[i]);
}
}