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代码,很多不足的地方,希望大家指正 立即下载

相关推荐

从星形到三角形:永磁同步电机FOC+SVPWM控制的相位偏移与扇区重构

本文深入探讨了将FOC+SVPWM控制方案从星形接法永磁同步电机移植到三角形接法时遇到的核心挑战。文章重点解析了由绕组连接方式差异导致的30度相位偏移问题,并详细阐述了如何为此重构扇区判断逻辑、矢量作用时间计算以及电流采样变换,为工程师提供了从理论到实践的完整移植指南。

ujm5678901的博客 544

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

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

S0ybean的博客 370

前导0预测(Leading-Zero Anticipator,LZA)

前导0预测(Leading-Zero Anticipator,LZA) 浮点加法在完成之后会进行尾数规格化移位,而在进行尾数加法时,可以使用前导0预测(Leading-Zero Anticipator,LZA)同时计算移位,前导0预测只发生在一个正数加上一个负数的情况下,电路图如图1所示。 图1 传统LZD算法和LZA算法 1. 基础算法 算法的目标是计算出加法结果序列左边连续0的数量,下文中对...

crw1111111的博客 7375

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

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

double222222的博客 1685

告别切换烦恼!用Parallels Desktop的Host-Only网卡,在macOS上直接访问虚拟机里的公司内网

本文详细介绍了如何在macOS上使用Parallels Desktop的Host-Only网卡直接访问虚拟机内的公司内网,告别频繁切换操作系统的烦恼。通过配置Host-Only网络模式,实现主机与虚拟机的安全高效通信,特别适合需要频繁访问内网资源的IT从业者。文章包含分步指南、自动化脚本和常见问题解决方案,帮助用户优化工作流程。

weixin_28739079的博客 362

set_data_check专题[使用,report_timing,setup/hold检查]

set_data_check用于约束『数据-对-数据』的『建立保持』时间检查,通常被称为非时序约束 ( non-sequential constraints ), 理论上set_data_check 可以设在任意的两个data pin 上,其中一个pin 称为 constrained pin 类似于寄存器的data pin, 另一个pin 称为related pin 类似于寄存器的clock pin.

cy413026的博客 1万+

【JAVA-数据结构】二叉树

这篇是二叉树相关内容。

Mr_star_galaxy的博客 1570

Maxwell个人初学经验及资料分享

前段时间学习了课题组基于Maxwell所建立的模型,因为以前从来没有使用过,只是按照一步一步记忆了操作,但总觉得不熟悉,我想是缺乏对这个软件整体的了解,真正想上手只会这一个模型也没有办法扩展。但是我感觉这些有限元分析软件学习起来应该有一些共性,基于以前对COMSOL学习的一点经验,我就在官网和其他网站找了一些学习资源构成一条基础入门之路,也可能有更好的资源,仅代表个人观点做一下分享。以上就是本人对该软件初步学习的一点理解,跟着这样的操作不到一个星期就能初步的掌握。...

怎么又是萝卜的博客 5631

java实现重建二叉树

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

Bryan__的专栏 3311

在 Android Studio 中接入 DeepSeek:加速 Android 开发进程

通过在 Android Studio 中接入 DeepSeek,Android 开发者能够充分利用人工智能技术带来的强大优势,显著提升开发效率和代码质量。从前期的安装准备,到具体的接入步骤,再到使用过程中的技巧和注意事项,每一个环节都为打造高效、智能的开发环境提供了有力支持。希望本文能帮助你顺利将 DeepSeek 融入到 Android Studio 的开发工作流程中,让你在 Android 开发的道路上更加得心应手,创造出更优质的 Android 应用。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4174

芯片研发完整全流程

芯片研发全流程可分为需求与架构设计、前端逻辑设计、后端物理设计、晶圆制造、封装测试五大阶段,涉及16个核心步骤。研发过程需要多学科交叉协作,包括微电子、物理、材料、计算机等。关键注意事项包括验证优先、工艺约束遵循、可测性设计等。芯片设计需要绘制纳米级精度的物理版图,而非传统工程图纸,需使用专业EDA工具而非KiCad这类PCB设计软件。完整研发流程具有高投入、高风险特点,需严格遵循行业标准和规范。

weixin_44520581的博客 227

重建二叉树(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

微信小程序 - 超详细小程序接入腾讯地图的完整流程,提供地图显示、IP 属地定位、地理位置名称、获取经纬度等超多功能示例(可一键复制并运行的功能源代码,详细的注释及常见问题汇总)小白直接上手!

微信小程序腾讯地图怎么接入,小程序项目中使用腾讯地图sdk,小程序中使用腾讯地图,微信小程序集成腾讯地图功能,微信小程序通过ip获取其地址、经纬度、详细地址,小程序使用腾讯地图跨域解决方法,微信小程序引入腾讯地图详细教程,原生小程序引入腾讯地图,微信小程序如何植入腾讯地图,微信小程序腾讯地图配置及使用详细教程,小程序植入腾讯地图SDK,微信小程序项目怎么用腾讯地图,微信小程序IP属地定位,获取当前用户位置名称,微信小程序如何使用腾讯地图获取用户的定位位置,在小程序中使用腾讯地图,实现定位,距离计算,实时搜索

🏆 前端领域优质创作者 8803

重建二叉树 - 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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

重建二叉树JAVA

重建二叉树

VipPetergee的博客 576

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

重建二叉树(Java)

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

qq_45042271的博客 364

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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、付费专栏及课程。

余额充值