1385:重建二叉树 @jobdu

重建二叉树(Java实现) 首先观察前序遍历和中序遍历的特点,前序遍历的第一个节点是根节点,而在中序遍历中,根节点将中序遍历的结果分为左子树和右子树。因此,我们可以通过前序遍历确定根节点,然后在中序遍历中找到根节点的位置,将中序遍历结果分为左子树和右子树的部分。接下来,我们可以递归地对左子树和右子树进行相同的操作,构建出完整的二叉树。接下来,我们在中序遍历数组中找到根节点的位置,通过遍历中序遍历数组,找到与根节点值相等的元素,记录其索引。根据中序遍历的性质,根节点的左侧部分是左子树的中序遍历结果,右侧部分是右子树的中序遍历结果。 阅读详情

思路很清晰,但是很容易就写错,特别是在写递归的参数时!为了避免混淆,我新建了多个临时变量来表示,这样会看的清楚一些,免得绕进去了!


题目1385:重建二叉树

时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:1574

解决:517

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。

输入:

输入可能包含多个测试样例,对于每个测试案例,

输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数。

输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列。

输入的第三行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的中序遍历序列。

输出:

对应每个测试案例,输出一行:

如果题目中所给的前序和中序遍历序列能构成一棵二叉树,则输出n个整数,代表二叉树的后序遍历序列,每个元素后面都有空格。

如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。

样例输入:
81 2 4 7 3 5 6 84 7 2 1 5 3 8 681 2 4 7 3 5 6 84 1 2 7 5 3 8 6
样例输出:
7 4 2 5 8 6 3 1 No



重点是这幅图!要弄清楚index的变化关系!



import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class S6 {

	public static void main(String[] args) throws FileNotFoundException {
		BufferedInputStream in = new BufferedInputStream(new FileInputStream("S6.in"));
        System.setIn(in);
		Scanner cin = new Scanner(System.in);
		
		while (cin.hasNextInt()) {
			List<Integer> preorder = new ArrayList<Integer>();
			List<Integer> inorder = new ArrayList<Integer>();
			int size = cin.nextInt();
			for(int i=0; i<size; i++){
				preorder.add(cin.nextInt());
			}
			for(int i=0; i<size; i++){
				inorder.add(cin.nextInt());
			}
			
//			System.out.println(preorder);
//			System.out.println(inorder);
			TreeNode root = rebuild(preorder, inorder, 0, preorder.size()-1, 0, inorder.size()-1);
			List<Integer> postorderList = new ArrayList<Integer>();
			postorder(root, postorderList);
			if(postorderList.size() == preorder.size()){
				for (Integer integer : postorderList) {
					System.out.print(integer + " ");
				}
				System.out.println();
			}else{
				System.out.println("No");
			}
			
//			inorder(root);
		}
	}
	
	public static TreeNode rebuild(List<Integer> preorder, List<Integer> inorder, int preorderStart, int preorderEnd, int inorderStart, int inorderEnd){
		int rootVal = preorder.get(preorderStart);
		int rootInorder = -1;
		for(int i=inorderStart; i<=inorderEnd; i++){
			if(inorder.get(i) == rootVal){
				rootInorder = i;
				break;
			}
		}
		if(rootInorder == -1){
			return null;
		}
		
		TreeNode root = new TreeNode(rootVal);
		int leftSize = rootInorder - inorderStart;
		int leftPreorderStart = preorderStart+1;
		int leftPreorderEnd = preorderStart + leftSize;
		int leftInorderStart = inorderStart;
		int leftInorderEnd = rootInorder-1;
		if(leftSize > 0){
			root.left = rebuild(preorder, inorder, leftPreorderStart, leftPreorderEnd, leftInorderStart, leftInorderEnd);
		}
		
		int rightPreorderStart = leftPreorderEnd+1;
		int rightPreorderEnd = preorderEnd;
		int rightInorderstart = rootInorder+1;
		int rightInorderEnd = inorderEnd;
		if(leftSize < preorderEnd-preorderStart){
			root.right = rebuild(preorder, inorder, rightPreorderStart, rightPreorderEnd, rightInorderstart, rightInorderEnd);
		}
		
		return root;
	}
	
	public static void inorder(TreeNode root){
		if(root != null){
			inorder(root.left);
			System.out.print(root.val + " ");
			inorder(root.right);
		}
	}
	
	public static void postorder(TreeNode root, List<Integer> postorderList){
		if(root != null){
			postorder(root.left, postorderList);
			postorder(root.right, postorderList);
			postorderList.add(root.val);
		}
	}
	
	static class TreeNode{
		int val;
		TreeNode left;
		TreeNode right;
		public TreeNode(int val){
			this.val = val;
		}
	}
}





二叉树的重建java代码 这是一个根据前序和中序恢复原来二叉树的java代码,很多不足的地方,希望大家指正 立即下载

相关推荐

Proteus 8.15仿真STM32F103C8,ADC采样总为0?别急着换芯片,先检查这3个配置

本文详细解析了在Proteus 8.15中仿真STM32F103C8时ADC采样值为0的常见原因及解决方法。从供电网络配置、时钟设置到ADC参数调整,提供了系统性的排查指南,帮助开发者快速定位问题,避免不必要的硬件更换。重点关注供电网络、时钟分频和ADC配置等关键环节。

weixin_30425949的博客 366

重建二叉树(附JAVA代码实现)

根据中序遍历和前序遍历确定二叉树

S0ybean的博客 370

用KalmanNet搞定非线性状态估计:当卡尔曼滤波遇上神经网络

本文深入探讨了KalmanNet如何将神经网络与卡尔曼滤波结合,以解决非线性状态估计中的模型失配和噪声不确定性问题。通过保留经典滤波框架并用RNN学习卡尔曼增益,该方法在无人机导航、机器人定位等场景中实现了模型驱动与数据驱动的优势互补,提升了估计的鲁棒性和灵活性。

mango的博客 309

【算法】重建二叉树并进行后序遍历的Java实现

通过上述步骤,我们可以实现根据前序遍历和中序遍历序列重建二叉树,并输出其后序遍历序列。这不仅帮助我们加深对二叉树遍历的理解,也为处理相关面试题提供了一个有力的工具。希望这篇文章对你有所帮助!

double222222的博客 1685

单细胞monocle3分析流程再整理

定义root cell, 推断拟时方向# 结合先验知识自定(示例数据)# 可视化示例数据,起点是随便点的。

zfyyzhys的博客 2100

同源策略与跨域

前言:最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的问题访问不到。大致看了下腾讯云关于设置跨域访问的教程,按照前端同学给的域名等选项就给配了,而且测试下来也是好的。但是呢一直不知道什么是跨域这里就做一个简单的学习记录。 一、同源策略 同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也是最基本的安全功能。同源策略会阻止一个域的javascrip脚本和另一个域的内容进行交互,是用于隔离潜在恶意文件的关键安全机制;关于这一点我们后面会举例说明。...

mijichui2153的博客 1万+

【JAVA-数据结构】二叉树

这篇是二叉树相关内容。

Mr_star_galaxy的博客 1570

基于ADS的低噪声放大电路设计

1. 低噪声放大器设计理论基础 1.1 低噪声放大器在通信系统中的作用 低噪声放大器的主要作用是放大天线从空中接收到的微弱信号,减小噪声干扰,以供系统解调出所需的信息数据。当今,人们对于各种无线通信工具的要求越来越高,如功率辐射要小、作用距离要远、覆盖范围要广等,这就对系统的接收灵敏度提出了更高的要求,系统接收灵敏度的计算公式为: Smin⁡=−144(dBmHz)+NF+10lg⁡BW(MHz)+SN(dB) {S_{\min }} = - 144\left( {\frac{{{\rm{dBm}}}}{

ASH_GUARDIAN的博客 4万+

java实现重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:根据题目给出的前序遍历、后序遍历数组,首先找出根节点 然后再根据中序遍历找到左子树和右子树的长度,分别构造出左右子树的前序遍历和中序遍

Bryan__的专栏 3311

英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置

本文给出了GTM与EVADC之间关联的细节,并通过两个实例分别说明了如何对寄存器进行配置。

无所适从的我的博客 2932

国科大学习资料--模式识别与机器学习(黄庆明)--2020期末考试题

国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 ============================================================================================================================================================

无名何许人的博客 2601

重建二叉树(java)

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 输入:[1,2,3,4,5,6,7],[3,2,4,1,6,5,7] 输出:{1,2,5,3,4,6,7} 1 / \ 2 5 / \ / \ 3 4 6 7 前置知识:如果右重复数字,则前序

qq_43284433的博客 514

量化 insider 爆料! 散户打板必亏?(打板必看!量化资金如何“隔日砸盘”收割散户)

量化开发 insider 爆料💥 散户追的涨停板📉,可能是机构故意做的陷阱!本文从技术视角拆解“涨停陷阱”,帮你看清市场真实逻辑🧠。

XiaoqiangClub的博客 450

重建二叉树 - Java

重建二叉树 - Java 做这题一定要知道二叉树的几种遍历,不懂得可以看我的上一篇博客:一起学习二叉树的几种遍历 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 输入 [1,2,3,4,5,6,7],[3,2,4,1,6,5,7] 返回值 {1,2,5,3,4,6,7} 思路: 根据题目的要求,输入一个二叉

Zhou_run的博客 316

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

重建二叉树JAVA

重建二叉树

VipPetergee的博客 576

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

重建二叉树(Java)

牛客链接 重建二叉树 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 解题思路 前序遍历的顺序:根节点,左节点,右节点。可知整棵树的根节点是前序序列的第一个值pre[0] 中序遍历的顺序:左节点,根节点,右节点。那么就可以根据前序遍历得到的根节点,在中序序列中查找,左边即使左树,右边即使右树。 递归分别构建左树

qq_45042271的博客 364

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java冒泡排序、数组、有注释

案例:随机生成0-99内的10个数,放入到数组中,并打印出来,然后进行冒泡排序,之后再打印 package hehe; public class 冒泡排序 { public static void main(String[] args) { // TODO 自动生成的方法存根 //定义数组对象 int[] arr=new int[10]; //通过循环赋值给数组 for(int i=0;i<arr.length;i++) { //生成0-99之类随机数变量a int

王大兴的王兴的博客 385

【剑指offer】 Java实现重建二叉树

【剑指offer】 Java实现重建二叉树 GitHub上的代码链接 /** * @Author: DaleyZou * @Description: 重建二叉树 * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 * 例如输入前序遍历序列{1,2,4,7,3,5,6,...

阿斯顿发顺丰水电费的说法都是的博客 246

【剑指offer 07】重建二叉树(Java)

【题目描述】 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 限制:0 <= 节点个数 <= 5000 【样例示例】 给出 前序遍历:preorder = [3,9,20,15,7] 中序遍历:inorder = [9,3,15,20,7] 返回如下的二叉树: 【解题思路】 树节点遍历的性质有三种:前中后序 前序遍历顺序:根节点 => 左节点 => 右节点 中序遍历顺序:左节点 => 根节点 => 右

song&life 214

剑指Offer 18. 重建二叉树-java实现

原题链接 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。 注意: 二叉树中每个节点的值都互不相同; 输入的前序遍历和中序遍历一定合法; 数据范围 树中节点数量范围 [0,100]。 代码案例:给定: 前序遍历是:[3, 9, 20, 15, 7] 中序遍历是:[9, 3, 15, 20, 7] 返回:[3, 9, 20, null, null, 15, 7, null, null, null, null] 返回的二叉树如下所示: (就是变成层序遍历) 3 / 9 20 / 15 7

qq_41810415的博客 249

重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

绣花针 2512

【剑指Offer题解:java】重建二叉树

文章目录题目分析代码 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 分析 根据中序遍历和前序遍历可以确定二叉树,具体过程为: 根据前序序列第一个结点确定根结点 根据根结点在中序序列中的位置分割出左右两个子序列 对左子树和右子树分别递归使用同样的方法继续分解 例如: 前序序列{1,2,4,7,3,5,6,8}

小游子YKY的博客 1400

剑指offer第二版面试题7:重建二叉树(java)

题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重新构造出该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。例如输入的前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历为{4,7,2,1,5,3,6,8},则重建出二叉树并输出它的头结点。 在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。但在中序遍历中,根节点的值在序列的中间,左子树的结点的值位于根节点的值的...

许文杰的博客 2938

剑指offer----重建二叉树---java实现

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:根据先序遍历数组,可以得到树的根节点,根据得到的根节点,去中序数组中找到相应的根节点,因为中序的遍历顺序是左--根--右,可以得到根节点的左子树和右

沙漏 2393

题7:重建二叉树(Java)

我GitHub上的:剑指offer题解​​​​​​​ 题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中...

Elaine1006的博客 1530
上一篇: 1511:从尾到头打印链表 @jobdu
下一篇: 1512:用两个栈实现队列
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值