题意:给二叉树的前序遍历和中序遍历,写出后序遍历。
想法:首先还原二叉树,然后再后序遍历一边即可;
前序遍历,是买一个node放入二叉树的顺序,中序遍历,完美展现了各个node在二叉树中的相对位置。
放1:找到1在y中的位置,1为根;记为x:1 2 4 7 3 5 8 9 6 记为Y:4 7 2 1 8 5 9 3 6
放2:在y中找到2的位置,发现在1的左边,则表示2是1的左儿子;
放4:在y中找到4的位置,发现在1的左边,2的左边,则表示4是2的左儿子;
放7:在y中找到7的位置,发现在1的左边,2的左边,4的右边,则表示7是4的右儿子;
放3:在y中找到3的位置,发现在1的右边,则表示3是1的右儿子;
......(其他的如同上述思路进行搜索)
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
const int N=1000+50;
struct node
{
int k;
node *lson;
node *rson;
};
int pre[N];
int mid[N];
int id[N];
int n;
int ok;
void BuildTree(node **rt,int id_cur)
{
if((*rt)==NULL)
{
*rt=(node*)malloc(sizeof(node));
(*rt)->k=mid[id_cur];
(*rt)->lson=NULL;
(*rt)->rson=NULL;
}
else
{
int id_cmp=id[(*rt)->k];
if(id_cur<id_cmp)
{
BuildTree(&((*rt)->lson),id_cur);
}
else
{
BuildTree(&((*rt)->rson),id_cur);
}
}
}
void MidPrintTree(node *rt)
{
if(rt!=NULL)
{
MidPrintTree(rt->lson);
MidPrintTree(rt->rson);
if(ok)
{
cout<<rt->k;
ok=0;
}
else
{
cout<<" "<<rt->k;
}
}
}
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
cin>>pre[i];
}
for(int i=1;i<=n;i++)
{
cin>>mid[i];
id[mid[i]]=i;
}
node *root;
root=NULL;
pre[0]=1;
for(int i=1;i<=n;i++)
{
BuildTree(&root,id[pre[i]]);
}
ok=1;
MidPrintTree(root);
cout<<endl;
}
return 0;
}