题意:给出二叉树的先序和中序遍历,输出它的后序遍历。
思路:对于每个子树,先序的第一个节点肯定是根节点。我们可以在中序中找到这个根节点,该节点左边的长度就是根的左子树的大小,右边同理。然后递归左右子树就可以了。
#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; }