问题描述
给定一棵二叉树的前序遍历和中序遍历序列,用你所熟悉的程序设计语言生成该二叉树,并将其后序遍历打印出来。为便于编程,二叉树的结点用单个大写英文字母表示,且结点互不重复。比如,输入前序遍历序列为DBACPMZX,中序遍历序列为ABCDMPXA,应生成的二叉树结构如下图所示:
应输出的后序遍历序列为ACBMXZPD
输入格式
两行两个大写字母字符串,分别代表前序和中序遍历
输入格式
一行表示后序遍历
样例输入
DBACPMZX
ABCDMPXZ
样例输出
ACBMXZPD
解题思路:
每个先序遍历串的第一个元素即为当前树的根结点,该结点将二叉树划分为了左右两颗子树,每次递归便可。只需要截取出先序和中序的子串。
设先序串:(0,s1.length() - 1),中序串:(0,s2.length() - 1)。
设先序中的第一个元素在中序中索引为index。
则左子树表示为(left1 + 1,left1 + index - left2,left2,index - 1)。
index - left2 :为当前左子树长度。
右子树可表示为(left1+ index- left2 + 1,right1,index+ 1,right2)。
java代码:(递归)
import java.io.*;
public class Main {
static String s1;
static String s2;
static StringBuilder builder = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
s1 = br.readLine();
s2 = br.readLine();
pre_in_caluPost(0, s1.length() - 1, 0, s2.length() - 1);
System.out.print(builder.toString());
}
public static void pre_in_caluPost(int left1,int right1,int left2,int right2) {
int index = s2.indexOf(s1.charAt(left1));
if(index > left2) {
pre_in_caluPost(left1 + 1, left1 + index - left2, left2, index - 1);
}
if(index < right2) {
pre_in_caluPost(left1 + index - left2 + 1, right1, index + 1, right2);
}
builder.append(s1.charAt(left1));
}
}