Farmer John takes the heritage of his cows very seriously. He is not, however, a truly fine bookkeeper. He keeps his cow genealogies as binary trees and, instead of writing them in graphic form, he records them in the more linear `tree in-order' and `tree pre-order' notations.
Your job is to create the `tree post-order' notation of a cow's heritage after being given the in-order and pre-order notations. Each cow name is encoded as a unique letter. (You may already know that you can frequently reconstruct a tree from any two of the ordered traversals.) Obviously, the trees will have no more than 26 nodes.
Here is a graphical representation of the tree used in the sample input and output:
C / \ / \ B G / \ / A D H / \ E F
The in-order traversal of this tree prints the left sub-tree, the root, and the right sub-tree.
The pre-order traversal of this tree prints the root, the left sub-tree, and the right sub-tree.
The post-order traversal of this tree print the left sub-tree, the right sub-tree, and the root.
PROGRAM NAME: heritage
INPUT FORMAT
Line 1: | The in-order representation of a tree. |
Line 2: | The pre-order representation of that same tree. |
SAMPLE INPUT (file heritage.in)
ABEDFCHG CBADEFGH
OUTPUT FORMAT
A single line with the post-order representation of the tree.SAMPLE OUTPUT (file heritage.out)
AEFDBHGC
ID: conicoc1
LANG: C
TASK: heritage
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
FILE *fin,*fout;
char Pre[26],In[26];
char Tree[27];
int Left[27],Right[27];
int NodeCount=0;
int BuildTree(int Pl,int Pr,int Il,int Ir)
{
if(Pl>Pr||Il>Ir){
return 0;
}
int Pc,Ic,Root;
int i;
for(i=Il;i<=Ir;i++)
if(Pre[Pl]==In[i])
break;
Ic=i;
Pc=Pl+Ic-Il;
Tree[Root=++NodeCount]=Pre[Pl];
Left[Root]=BuildTree(Pl+1,Pc,Il,Ic-1);
Right[Root]=BuildTree(Pc+1,Pr,Ic+1,Ir);
return Root;
}
void PostOrder(int Root)
{
if(Left[Root])
PostOrder(Left[Root]);
if(Right[Root])
PostOrder(Right[Root]);
fprintf(fout,"%c",Tree[Root]);
}
int main()
{
fin=fopen("heritage.in","r");
fout=fopen("heritage.out","w");
int i;
int Pl,Pr,Il,Ir;
fscanf(fin,"%s\n%s",In,Pre);
Pl=Il=0;
Pr=strlen(Pre)-1;
Ir=strlen(In)-1;
BuildTree(Pl,Pr,Il,Ir);
PostOrder(1);
fprintf(fout,"\n");
return 0;
}
详细的题解在这篇文章中有: