算法训练 根据前、中序遍历求后序遍历 java 题解 705

问题描述

  给定一棵二叉树的前序遍历和中序遍历序列,用你所熟悉的程序设计语言生成该二叉树,并将其后序遍历打印出来。为便于编程,二叉树的结点用单个大写英文字母表示,且结点互不重复。比如,输入前序遍历序列为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));
	}
}

提交截图:

Guess you like

Origin blog.csdn.net/weixin_48898946/article/details/120852769