前序和中序确定后序
a// 前序
b// 中序
void getpost(int root,int start,int end)
{
if(start>end) return ;
int i=start;
while(i<end&&b[i]!=a[root]) i++;
getpost(root+1,start,i-1);
getpost(root+(i-start)+1,i+1,end);
ans.push_back(a[root]);
}
getpost(0,0,n-1);
中序后序确定前序
//a 后序
//b 中序
void get_pre_order(int root, int start, int end){
if(start > end) return;
int i = start;
while(i < end && b[i] != a[root]) i++;
ans.push_back(a[root]);
getpost(root-(end-i)-1, start, i-1);
getpost(root-1, i+1, end);
}
getpost(n-1,0,n-1);
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
typedef long long ll;
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
int n, m, k;
string pre,in,post;
struct node
{
char data;
node *l,*r;
};
void build1(node *&root,int rt,int start,int end)
{
if(start>end) return ;
int ind=start;
while(ind<end&&pre[rt]!=in[ind]) ind++;
if(root==NULL)
{
root=new node;
root->data=pre[rt];
root->l=NULL;
root->r=NULL;
}
build1(root->l,rt+1,start,ind-1);
build1(root->r,rt+(ind-start)+1,ind+1,end);
}
void dfs1(node *rt)
{
if(rt==NULL) return ;
dfs1(rt->l);
dfs1(rt->r);
cout<<rt->data;
}
void build2(node *&root,int rt,int start,int end)
{
if(start>end) return ;
int ind=start;
while(ind<end&&post[rt]!=in[ind]) ind++;
if(root==NULL)
{
root=new node;
root->data=post[rt];
root->l=NULL;
root->r=NULL;
}
build2(root->l,rt-(end-ind)-1,start,ind-1);
build2(root->r,rt-1,ind+1,end);
}
void dfs2(node *rt)
{
if(rt==NULL) return ;
cout<<rt->data;
dfs2(rt->l);
dfs2(rt->r);
}
int main()
{
cin>>pre>>in;
node *rt1=NULL;
build1(rt1,0,0,8);
dfs1(rt1);
cout<<endl<<endl;;
node *rt2=NULL;
cin>>post>>in;
build2(rt2,8,0,8);
dfs2(rt2);
cout<<endl;
}
/*
ABDEHCFGI
DBHEAFCGI
DHEBFIGCA
DBHEAFCGI
*/