问题描述:
已知一个树的前序和中序,求后序。
样例:
样例输入:
9
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6
样例输出:
7 4 2 8 9 5 6 3 1
实现:
#include<iostream>
#include <string>
using namespace std;
const int maxn=1000;
struct Node
{
int left;
int right;
int data;
};
Node Tree[maxn];
int N;
int pre[maxn];
int in[maxn];
int ROOT;
void init(int index)
{
Tree[index].left=-1;
Tree[index].right=-1;
Tree[index].data=in[index];
}
void dfs(int parpent,int child)
{
if(child<parpent)
{
if(Tree[parpent].left==-1)
{
init(child);
Tree[parpent].left=child;
}
else{
dfs(Tree[parpent].left,child);
}
}
else{
if(Tree[parpent].right==-1)
{
init(child);
Tree[parpent].right=child;
}
else{
dfs(Tree[parpent].right,child);
}
}
}
void constructTree()
{
int i,j;
for(i=0;i<N;i++)
{
if(in[i]==pre[0])
{
ROOT=i;
init(ROOT);
break;
}
}
for(i=1;i<N;i++)
{
for(j=0;j<N;j++)
{
if(pre[i]==in[j])
{
dfs(ROOT,j);
break;
}
}
}
}
void printPost(int index)
{
if(Tree[index].left!=-1)
{
printPost(Tree[index].left);
}
if(Tree[index].right!=-1)
{
printPost(Tree[index].right);
}
cout<<Tree[index].data;
if(index!=ROOT)
cout<<" ";
}
int main()
{
int i;
while(cin>>N)
{
for(i=0;i<N;i++)
cin>>pre[i];
for(i=0;i<N;i++)
cin>>in[i];
constructTree();
printPost(ROOT);
cout<<endl;
}
return 0;
}