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

39 篇文章 0 订阅
26 篇文章 1 订阅
该博客主要介绍了如何通过给定的二叉树前序和中序遍历序列来构建二叉树,并输出其后序遍历。博主提供了一个Java代码实现,利用递归的方法,根据先序遍历的第一个元素找到中序遍历中的根节点,进而划分左右子树进行递归。样例输入为前序遍历DBACPMZX和中序遍历ABCDMPXZ,输出的后序遍历序列为ACBMXZPD。解题思路涉及到了二叉树的构造和遍历算法。
摘要由CSDN通过智能技术生成

问题描述

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

提交截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值