题目大意:给定一棵 N 个节点的二叉树的前序遍历和中序遍历,求其后序遍历。
题解:递归操作,每次只需知道先序遍历和中序遍历的开始点,左子树大小即可,根据前序遍历的开始位置可知子树根节点的坐标,再在中序遍历中找到对应的左子树大小,递归操作下去,一棵二叉树就被完全地确定下来了。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int n,pre[maxn],mid[maxn];
void read_and_parse(){
for(int i=1;i<=n;i++)scanf("%d",&pre[i]);
for(int i=1;i<=n;i++)scanf("%d",&mid[i]);
}
void dfs(int a,int b,int n,int tag){
int i;
if(n<=0)return;
for(i=0;pre[a]!=mid[b+i];i++);
dfs(a+1,b,i,0);
dfs(a+i+1,b+i+1,n-i-1,0);
printf("%d",pre[a]);
if(!tag)printf(" ");
else puts("");
}
void solve(){
dfs(1,1,n,1);
}
int main(){
while(scanf("%d",&n)!=EOF){
read_and_parse();
solve();
}
return 0;
}