当前位置: 首页 > news >正文

代码随想录二叉树——从中序与后序遍历序列构造二叉树

题目

根据一棵树的中序遍历与后序遍历构造二叉树。

注意: 你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树:
在这里插入图片描述

思路

以后序数组的最后一个元素(因为后序遍历是左右中,最后一个元素为根节点)为切割点,先切中序数组(因为中序比那里是左中右,可以根据根节点分出左右子树),根据中序数组,反过来再切后序数组(继续找新的根节点,然后继续切下去)。一层一层切下去,每次后序数组最后一个元素就是节点元素。

采用递归法

  1. 如果数组大小为0,说明是空节点
  2. 如果不为空,则选取最后一个元素(根节点)
  3. 在中序数组中找到这个根节点的位置
  4. 切割中序数组,切成中序左数组和中序右数组
  5. 切割后序数组,切成后序左数组和后序右数组
  6. 递归处理左区间和右区间

注:切割过程中保持循环不变量 (这里保持左闭右开)

java代码如下:

class Solution {
	Map<Integer,Integer> map;//根据数值查位置
	public TreeNode buildTree(int[] inorder,int[] postorder){
		map =new HahMap<>();
		for(int i= 0; i< inorder.length; i++){
			map.put(inorder[i],i);//用map保存中序序列的数值对应的下标位置i
		}
		return findNode(inorder, 0, inorder.length,postprder, 0, postorder.length);//左闭右开
	}
	
	public TreeNode findNode(int[] inorder,int inBegin,int inEnd,int[] postorder,int postBegin,int postEnd){
		if(inBegin >= inEnd || postBegin >= psotEnd){//不满足左闭右开,说明没有元素,返回空树
			return null;
		}
		int rootIndex = map.get(postorder[pestEnd-1]);//找到后序遍历的最后一个元素在中序遍历中的位置
		TreeNode root = new TreeNode(inorder[rootIndex]);//构造节点,存放根节点值
		int lenOfLeft = rootIndex- inBegin;//确定中序左子树的长度,用来确定切割后序左子树的长度(因为中序左数组长度和后序左子树长度相等)
		root.left = find(inorder, inBegin, rootIndex , postorder, postBegin, postBegin + lenOfLeft);
		root.right = findNode(inorder, rootIndex + 1, inEnd,postorder, postBegin + lenOfLeft, postEnd - 1);
		return root;
	}
}

相关文章:

  • 【2023泰凌微笔试题】~ 题目及参考答案
  • 采用Python中Tkinter模块的Treeview 组件显示xml文件
  • synchronized的实现原理与应用
  • 网上商城之支付
  • 一次搞懂Java如何调用Kotlin的高级特性
  • MyBatis各种SQL操作及执行添加功能获取自增的主键
  • 【学习笔记】模拟赛题解
  • node.js 使用教程-3.gulp-file-include 详细教程
  • 【可视化大屏教程】用Python开发智慧城市数据分析大屏
  • 【云原生 | 从零开始学Kubernetes】二十三、Kubernetes控制器Statefulset
  • git三板斧--Linux
  • 内存分配.
  • 谷粒商城超详细笔记+踩坑(2)——分布式组件、前端基础(回顾知识点)
  • 为 TiDB 客户端服务端间通信开启加密传输
  • C语言函数解决问题:1.求二进制中不同位的个数;2.交换二进制的奇数位和偶数位;3.使用指针打印数组内容
  • docker-consul
  • ES6系统学习----从Apollo Client看解构赋值
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • java正则表式的使用
  • Redis字符串类型内部编码剖析
  • Theano - 导数
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 关于Java中分层中遇到的一些问题
  • 基于webpack 的 vue 多页架构
  • 将 Measurements 和 Units 应用到物理学
  • 排序算法之--选择排序
  • 如何实现 font-size 的响应式
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用权重正则化较少模型过拟合
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 如何在招聘中考核.NET架构师
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 说说我为什么看好Spring Cloud Alibaba
  • $.ajax,axios,fetch三种ajax请求的区别
  • (23)Linux的软硬连接
  • (6)设计一个TimeMap
  • (十五)使用Nexus创建Maven私服
  • (原)本想说脏话,奈何已放下
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)linux下的时间函数使用
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .Net IE10 _doPostBack 未定义
  • .Net Redis的秒杀Dome和异步执行
  • .Net Web项目创建比较不错的参考文章
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .net开发引用程序集提示没有强名称的解决办法
  • .net实现客户区延伸至至非客户区
  • .Net中ListT 泛型转成DataTable、DataSet
  • :not(:first-child)和:not(:last-child)的用法
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试