American Heritage
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
Analysis
A simple problem with binary tree structure. The first element of preorder traversal is root, which is used of building a tree. Constructing recurrensively, the tree will be build successfully.
In this problem, I made a mistake of applying space. When I applying for a Node of root, I only declared it in the function without opening it. Well, the pointer outside became wandering.It is fantasy!
Code

/**//*
ID:braytay1
PROG:heritage
LANG:C++
*/
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
ifstream fin("heritage.in");
ofstream fout("heritage.out");

typedef struct Node
{
char val;
struct Node *lc,*rc;
}Node, *BiTree;

Node* maketree(string &prev,string &inv)
{
if (prev.size()==0||inv.size()==0) return NULL;
Node *root=new Node[1];
//This sentence is very IMPORTANT!!
//The tree can only be saved with this sentence
//since the variables declared in a function are
//saved in the Stack Storage instead of globle storage.
root->val=prev[0];
string lp,li,rp,ri;
int len=0;

for (unsigned int i=0;;i++)
{

if (inv[i]==prev[0])
{
len=i;
break;
}
}

for (int i=0;i<len;i++)
{
lp.push_back(prev[i+1]);
li.push_back(inv[i]);
}

for (int i=len+1;i<prev.size();i++)
{
rp.push_back(prev[i]);
ri.push_back(inv[i]);
}
root->lc=maketree(lp,li);
root->rc=maketree(rp,ri);
return root;
}

void post_tra(BiTree &r)
{
if (r==NULL) return;
post_tra(r->lc);
post_tra(r->rc);
fout<<r->val;
}

int main()
{
string pretra,intra;
fin>>intra>>pretra;
BiTree Top;
Top=maketree(pretra,intra);
post_tra(Top);
fout<<endl;
return 0;
};