由题意得:
1.输入二叉树的前序遍历和中序遍历,输出这个二叉树的后序遍历
2.前序遍历的顺序是:根-左子树-右子树 中序遍历的顺序是:左子树-根-右子树 后序遍历的顺序是:左子树-右子树-根
3.根据前后遍历找到根后(由定义得:前序遍历的第一个为主根),可以将二叉树分为两个部分(左子树、右子树)
4.重复上一个步骤,直到遍历完所有数字
5.后序遍历就是将每次找到的根存入数组
6.图示如下:
7.代码如下:
#include<iostream>
using namespace std;
const int N=1005;
int pre[N],mid[N],last[N],n;
void getlast(int pa,int pb,int ma,int mb,int la,int lb)
{
if(pa>pb||ma>mb||la>lb)
return ;
int a,b,i;
for(i=ma; i<=mb; i++)
if(mid[i]==pre[pa])
break;
a=i-ma;
b=mb-i;
last[lb]=mid[i];
getlast(pa+1,pa+a,ma,i-1,la,la+a-1);
getlast(pb-b+1,pb,i+1,mb,lb-b,lb-1);
}
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];
getlast(1,n,1,n,1,n);
for(int i=1; i<n; i++)
cout<<last[i]<<" ";
cout<<last[n]<<endl;
}
return 0;
}