学习树的前序中序转后序
注意这是用存下标的方式写的
注意返回下标
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <cstring>
#include <cmath>
#include <map>
using namespace std;
int n;
int in[51000],pre[51000];
struct tr{
int lc,rc,id;
};
vector<tr> tree(51000);
vector<int> post;
int build(int prel, int inl, int inr){
if(inl > inr) return -1;
int i = inl;
int root = prel;
while(i<inr&&in[i]!=pre[prel]) i++;
tree[root].lc = build(prel+1,inl,i-1);
tree[root].rc = build(prel+i-inl+1,i+1,inr);
tree[root].id = pre[prel];
return root;
}
void postorder(int root){
//if(tree[root].id==-1) return ;
if(tree[root].lc!=-1)
postorder(tree[root].lc);
if(tree[root].rc!=-1)
postorder(tree[root].rc);
post.push_back(tree[root].id);
}
int main()
{
cin >> n;
for(int i=0; i<n; i++){
cin >> pre[i];
}
for(int i=0; i<n; i++){
cin >> in[i];
}
build(0,0,n-1);
postorder(0);
/*cout << endl;
for(int i=0; i<n; i++){
cout << tree[i].id << " " << i << endl;
cout << tree[i].lc << " " << tree[i].rc << endl;
}
cout << "!!" << endl;*/
//for(int i=0; i<n; i++){
cout << post[0] << endl;
//}
return 0;
}