#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct BTNode *BTree;
typedef struct BTNode{
char data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
BTree getBTree(char pre[],char in[],int lp,int rp,int li,int ri){
BTree b;
b=(BTNode*)malloc(sizeof(BTNode));
b->data=pre[lp];
b->lchild=NULL,b->rchild=NULL;
if(lp==rp) return b;
int Clchild=0;
for(int i=li;;i++){
if(in[i]!=pre[lp]) Clchild++;
else break;
}
if(Clchild>0)
b->lchild=getBTree(pre,in,lp+1,lp+Clchild,li,li+Clchild-1);
if(rp-lp-Clchild>0)
b->rchild=getBTree(pre,in,lp+Clchild+1,rp,li+Clchild+1,ri);
return b;
}
void post_dfs(BTree b){
if(b!=NULL){
post_dfs(b->lchild);
post_dfs(b->rchild);
printf("%c",b->data);
}
}
char in[100005],pre[100005];
int main(){
scanf("%s",(pre+1));scanf("%s",(in+1));
BTree b=getBTree(pre,in,1,strlen(pre+1),1,strlen(in+1));
post_dfs(b);
return 0;
}
通过hdu1710的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct BTNode *BTree;
typedef struct BTNode{
int data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
int IN[10005];
BTree getBTree(int pre[],int in[],int lp,int rp,int li,int ri){
BTree b;
b=(BTNode*)malloc(sizeof(BTNode));
b->data=pre[lp];
b->lchild=NULL,b->rchild=NULL;
if(lp==rp) return b;
int Clchild=IN[pre[lp]]-li;
if(Clchild>0)
b->lchild=getBTree(pre,in,lp+1,lp+Clchild,li,li+Clchild-1);
if(rp-lp-Clchild>0)
b->rchild=getBTree(pre,in,lp+Clchild+1,rp,li+Clchild+1,ri);
return b;
}
int post[100005],cpos=0;
void post_dfs(BTree b){
if(b!=NULL){
post_dfs(b->lchild);
post_dfs(b->rchild);
post[++cpos]=b->data;
}
}
int in[100005],pre[100005];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
cpos=0;
for(int i=1;i<=n;i++)scanf("%d",&pre[i]);
for(int i=1;i<=n;i++)scanf("%d",&in[i]),IN[in[i]]=i;
BTree b=getBTree(pre,in,1,n,1,n);
post_dfs(b);
for(int i=1;i<n;i++)printf("%d ",post[i]);
printf("%d\n",post[n]);
}
return 0;
}