题意:给出二叉树的先序和中序遍历,输出它的后序遍历。
思路:对于每个子树,先序的第一个节点肯定是根节点。我们可以在中序中找到这个根节点,该节点左边的长度就是根的左子树的大小,右边同理。然后递归左右子树就可以了。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#define ll long long
#define max3(a,b,c) max(a,max(b,c))
#define MAXN 4100000
using namespace std;
int pre[1010];
int in[1010];
int post[1010];
int n;
int m;
void fun(int start,int end,int* arr){
if(start>end)return ;
if(start==end){
post[++m]=pre[start];return;
}
int root=pre[start];
int k=0;
while(1){
if(arr[k]==pre[start])break;
k++;
}
fun(start+1,start+k,arr);
fun(start+k+1,end,arr+k+1);
post[++m]=pre[start];
}
int main(){
while(cin>>n){
m=0;
for(int i=1;i<=n;i++){
scanf("%d",&pre[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&in[i]);
}
fun(1,n,in+1);
for(int i=1;i<=n;i++){
printf("%d",post[i]);
if(i!=n)printf(" ");
}
printf("\n");
}
return 0;
}