Note
- 二叉树
- 模板题 思路不难
- 先序遍历&中序遍历–>后序遍历
Code
#include<bits/stdc++.h>
using namespace std;
vector<int> pre,in,post;
struct node{
int data;
node* left;
node* right;
};
node* create(int pL,int pR,int iL,int iR){
if(pL>pR||iL>iR) return NULL;
node* root=new node;
root->data=pre[pL];
int k;
for(k=iL;k<=iR;k++)
if(pre[pL]==in[k]) break;
int num_left=k-iL;
root->left=create(pL+1,pL+num_left,iL,k-1);
root->right=create(pL+num_left+1,pR,k+1,iR);
return root;
}
void postorder(node* root){
if(root==NULL) return;
postorder(root->left);
postorder(root->right);
post.push_back(root->data);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
int n,num;
cin>>n;
string p;
stack<int> s;
for(int i=0;i<2*n;i++){
cin>>p;
if(p=="Push"){
cin>>num;
s.push(num);
pre.push_back(num);
}
else{
in.push_back(s.top());
s.pop();
}
}
node* root=create(0,pre.size()-1,0,in.size()-1);
postorder(root);
for(int i=0;i<post.size();i++){
if(i!=0) printf(" ");
printf("%d",post[i]);
}
return 0;
}