题目描述
给出一棵二叉树的先序和中序数组,通过这两个数组直接生成正确的后序数组。
输入描述:
第一行一个整数 n,表示二叉树的大小。
第二行 n 个整数 a_i,表示二叉树的先序遍历数组。
第三行 n 个整数 b_i,表示二叉树的中序遍历数组。
输出描述:
输出一行 n 个整数表示二叉树的后序遍历数组。
示例1
输入
3
1 2 3
2 1 3
输出
2 3 1
解法一:递归
思路: 注意后续插入顺序即可
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
String[] p = br.readLine().trim().split(" ");
int [] pre = new int[p.length];
for(int i=0;i<pre.length;i++){
pre[i] = Integer.parseInt(p[i]);
}
String[] m = br.readLine().trim().split(" ");
int [] mid = new int[m.length];
for(int i=0;i<mid.length;i++){
mid[i] = Integer.parseInt(m[i]);
}
int[] post = getPost(pre,mid);
StringBuilder sb = new StringBuilder();
for(int i=0;i<post.length;i++){
sb.append(post[i]+" ");
}
System.out.println(sb.toString().trim());
}
public static int[] getPost(int[] pre,int[] mid){
if(pre==null||mid==null) return null;
int[] post = new int[pre.length];
getPost(pre,0,pre.length-1,mid,0,mid.length-1,post,0,pre.length-1);
return post;
}
public static void getPost(int[] pre,int pi,int pj,int[] mid,int mi,int mj,int[] post,int l,int r){
if(pi>pj) return ;
post[r] = pre[pi];
int i=mi;
for(;i<=mj&&mid[i]!=pre[pi];i++);
getPost(pre,pi+1,pi+i-mi,mid,mi,i-1,post,l,l+i-mi-1);
getPost(pre,pi+i-mi+1,pj,mid,i+1,mj,post,l+i-mi,r-1);
}
}