分别从中序、后续中组成二叉树(likou106)

news/2023/10/4 0:19:59

likou106本题会给你两个数组,arr1由中序遍历,arr2用后续遍历,返回一个原始二叉树。

首先我们要理解好三种遍历方式的顺序:

(25条消息) 二叉树的理论知识_小肖在路上的博客-CSDN博客

然后再回到这个题:

创建二叉树唯一的方法就是,创建根节点,然后创建左右节点连接上。

所以我们在解题中必须创建根节点,所以就得找到根节点在哪里。 

寻找根节点:

arr2既然是后续遍历,arr2数组的最后一个元素,肯定是一个根节点,并且是最上层的根节点。所以我们每次都是找到arr2的最后一个元素作为根节点。然后递归创建左右节点。

 寻找左右节点:

 arr1是中序遍历,就说明它的根节点左边就是左节点,右边就是右节点。

所以我们每次寻找到根节点后,就可以在arr1中找到该节点的左右节点。

 

package lqb;import java.util.HashMap;
import java.util.Map;import shuJuJieGouYuSuanFa.erChaShu.*;public class likou106 {public static void main(String[] args) {TreeNode root = new likou106().buildTree(new int[]{9, 3, 15, 20, 7}, new int[]{9, 15, 7, 20, 3});f1(root);}private static void f1(TreeNode root) {if (root == null) {return;}System.out.println(root.val);f1(root.left);f1(root.right);}Map<Integer, Integer> map = new HashMap<>();public TreeNode buildTree(int[] arr1, int[] arr2) {for (int i = 0; i < arr1.length; i++) {map.put(arr1[i], i);}return dfs(arr1, 0, arr1.length, arr2, 0, arr2.length);}private TreeNode dfs(int[] arr1, int arr1Kai, int arr1Lan, int[] arr2, int arr2Kai, int arr2Lan) {if (arr1Lan <= arr1Kai || arr2Lan <= arr2Kai) {return null;}int t = map.get(arr2[arr2Lan - 1]);TreeNode root = new TreeNode(arr1[t]);int indexLen = t - arr1Kai;root.left = dfs(arr1, arr1Kai, t, arr2, arr2Kai, arr2Kai + indexLen);root.right = dfs(arr1, t + 1, arr1Lan, arr2, arr2Kai + indexLen, arr2Lan - 1);return root;}
}

既然数组开始下标与结束下标重合,就说明已经没有节点可以使用了。直接返回null,作为所谓的空叶子节点

  if (arr1Lan <= arr1Kai || arr2Lan <= arr2Kai) {return null;}

然后这里会运用到一个哈希表:

快速寻找某个值的出现个数、位置。

我们要第一时间想到哈希表

既然要在arr1中寻找根节点对应的左右节点。我们就直接将arr1的数据、下标存入map中,快速寻找到下标。 记得将map成员化

 

 for (int i = 0; i < arr1.length; i++) {map.put(arr1[i], i);}

然后就是寻找根节点:arr2的最后一个数据所对应在arr1的下标,它的左边就是该根节点的左节点,右边就是右节点

 int t = map.get(arr2[arr2Lan - 1]);

现在分别创建根节点:

   TreeNode root = new TreeNode(arr1[t]);

然后记录根节点的左节点个数:t为根节点的下标,t的左边所有元素都是左节点,

所以直接【t-arr1开始下标】,因为下一次递归,这一段区间又是一个完整的二叉树,也有左右节点。

 int indexLen = t - arr1Kai;

现在将左右节点赋值:也就是递归求左右节点(求子二叉树)

在这里我们得清楚,递归的参数含义:

 private TreeNode dfs(int[] arr1, int arr1Kai, int arr1Lan, int[] arr2, int arr2Kai, int arr2Lan) 

arr1:中序遍历的数组

arr1Kai:中序遍历数组的开始下标

arr1Lan:中序遍历数组的结束下标。

arr2:后续数组

arr2Kai:后续数组的开始下标。

arr2Lan:后续数组的结束下标。

我也是在写这篇博客的时候才真正理解到,这里为什么要怎么做、

我们通过赋值根节点的左右节点进行递归,就把两个数组分成可四个部分,分别是:

由根节点划分的arr1的左节点,arr1的右节点

再通过根节点的划分,得到arr2的左节点和右节点。

arr1的左节点则是直接【开始节点,t】arr1的右节点【t+1,arr1结束

arr2的左节点是【开始节点,开始节点+t】右节点是【开始节点+t,arr2结束节点

进行左右节点赋值的时候,将四个切割数组传入,达到赋值的目的。

        root.left = dfs(arr1, arr1Kai, t, arr2, arr2Kai, arr2Kai + indexLen);root.right = dfs(arr1, t + 1, arr1Lan, arr2, arr2Kai + indexLen, arr2Lan - 1);

 各位一定要仔细思考代码的逻辑,不说了,我再去想半小时。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.yaotu.net/news/91021.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

注意力机制Attention详解

注意力机制Attention详解 一、前言 2018年谷歌提出的NLP语言模型Bert一提出&#xff0c;便在NLP领域引起热议&#xff0c;之所以Bert模型能够火出圈&#xff0c;是由于Bert模型在NLP的多项任务中取得了之前所有模型都不能达到的出色效果。那么Bert模型它是如何提出的呢&#x…

短信平台不知道怎么选?来看看这几个平台:

不少程序员在做项目的时候会碰上短信收发验证码的问题&#xff0c;通常来说解决方案有二&#xff0c;要么自己写一个验证码模块儿&#xff0c;要么去找短信平台。但自己写一个验证码模块是出了名的麻烦&#xff0c;而且会耗费掉不少时间&#xff0c;有着时间到不如优化下自己的…

Linux入门:Windows上虚拟机VMware安装Ubuntu系统

本文将详细介绍如何在虚拟机VMware上安装Ubuntu系统。 请准备好以下安装包文件&#xff1a; VMware版本-16.2.0&#xff1a;VMware-workstation-full-16.2.0-18760230.exe Ubuntu 版本-20.04.3&#xff1a;ubuntu-20.04.3-desktop-amd64.iso 本文基于以上软件版本进行操作&…

有营养的算法笔记(七)

字符串消除 1.题目描述 给定一个只由’a’和’b’组成的字符串str&#xff0c;str中"ab"和"ba"子串都可以消除&#xff0c; 消除之后剩下字符会重新靠在一起&#xff0c;继续出现可以消除的子串…你的任务是决定一种消除的顺序&#xff0c;最后让str消除到…

K_A01_001 基于单片机驱动WS2812 点灯流水灯 0-9显示

目录 一、资源说明 二、基本参数 三、通信协议说明 WS2812时序: 代码: 四、部分代码说明 1、接线说明 2、主函数 五、相关资料链接 六、数字提取格式 七、视频效果展示与资料获取 八、项目所有材料清单 九、注意事项 十、接线表格 一、资源说明 单片机型号 测试条件 模…

Web APIs:事件高级--注册事件(绑定事件)

注册事件俩种方式 给元素添加事件&#xff0c;称为注册事件或者绑定事件。 注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 传统注册方式 利用 on 开头的事件 onclick btn.onclick function() {} 特点&#xff1a; 注册事件的唯一性 同一个元素同一个事件只…

【golang_gorm】ErrRecordNotFound 什么情况下返回? one record 还是 slice ?源码给出回答

1. 测试代码 type Topic struct {gorm.ModelTitle stringContent string }func main() {db, err : gorm.Open("sqlite3", "test.db")if err ! nil {panic("Unable to connect to the database")}// db.LogMode(true)defer db.Close()// Automa…

JS高级:Proxy-Reflect-Promise(一)

目录 监听对象 Proxy Reflect proxy和reflect可以共同完成代理 Reflect.construct Promise 监听对象 监听对象的属性被设置或被获取的过程 用for循环给每个key设置defineProperty&#xff0c;在里面通过set和get监听设置和获取 <script>const obj{name:jjj,age:14…

【matlab图像处理笔记5】【图像变换】(四)图像的正交变换

文章目录推荐阅读前言图像正交变换简介离散傅里叶变换对图像进行离散傅里叶变换的作用二维离散傅里叶变换频谱图示例离散余弦变换简介基本原理示例推荐阅读 本系列其他文章 【matlab图像处理笔记2】【图像变换】&#xff08;一&#xff09;图像的算术运算与几何变换、图像插值…

Java 类和对象 详解+通俗易懂

文章目录类和对象1. 面对对象的初步认识1.1 什么是面向过程&#xff1f;什么又是面向对象&#xff1f;1.2 对象、成员变量和成员方法的关系和理解2. 类的定义和使用2.1 简单认识类2.2 类的定义格式2.3 小试身手3. 类的实例化3.1 什么是实例化3.2 类和对象的说明4. this 引用4.1…

Linux信号量:POSIX标准接口、实现生产者与消费者模型

目录 一、信号量简介 1.信号量 2.信号量与条件变量的区别 二、信号量标准接口POSIX 1.定义信号量 2.初始化信号量 3.P操作 4.V操作 5.释放信号量 三、信号量实现生产者与消费者模型 1.信号量实现线程安全的环形队列 2.完整代码 一、信号量简介 1.信号量 本质&…

Juniper IP monitor(RPM)

本文已Juniper防火墙为例&#xff0c;介绍IP monitoring。 Juniper的IP monitor类似于思科的SLA ,华为的NQA &#xff0c; Juniper使用到的工具叫做real-time performance monitoring (RPM) &#xff0c;当你看到RPM这个单词的时候不要陌生。RPM可以用在很多路由相关的地方&a…

三分钟让你掌握数据结构——单链表

数据结构——单链表 &#x1f3d6;️专题&#xff1a;数据结构 &#x1f648;作者&#xff1a;暴躁小程序猿 ⛺简介&#xff1a;双非本科大二小菜鸟一枚&#xff0c;希望大佬们指点~ 文章目录数据结构——单链表前言一、链表是什么&#xff1f;二、单链表的功能实现1.头文件2.…

【tio-core】1、tio-study是学习t-io的第一步

为帮助第一次使用 t-io 的朋友更快地学习上手 t-io&#xff0c;提供了一个 tio-study 实例项目&#xff0c;快速体验 t-io TCP长连接应用 1、项目地址 https://gitee.com/asurplus/tio-study2、项目结构 1、tio-common 公共模块&#xff0c;client 和 server 公用 common 模…

不需要K值实现打开链接、扫码即可在手机、电脑端弹出QQ添加好友框的方法

本篇文章主要讲解&#xff1a;pc与手机端浏览器打开链接即可弹出QQ好友添加框的代码实现方式 日期&#xff1a;2022年10月22日 有很多朋友&#xff0c;会觉得qq添加好友需要提供链接里的k值&#xff0c;但是实际上方向错了&#xff0c;k值是腾讯那边加密过的&#xff0c;因为看…

MySQL数据库更改存储位置从C盘到D盘

MySQL随便打开一个页面输入&#xff1a; show global variables like "%datadir%"; 语句。 因为我这边已经修改到了D盘 所以这里出现的的D盘路径&#xff0c;你的如果没有修改这里是C盘路径&#xff0c;复制C盘路径C:\ProgramData\MySQL\MySQL Server 8.0\Data…

【附源码】计算机毕业设计SSM网络求职招聘系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

学习open62541 --- [71] Alarm and Condition

本文讲述Alarm and Condition的用法&#xff0c;主要以源码里提供的例子为基础进行讲解和演示&#xff0c;即tutorial_server_alarms_conditions.c&#xff0c;该例子写的有点乱&#xff0c;本文会对代码进行修改&#xff0c;便于理解分析。 PS&#xff1a;在open62541里Alarm…

欧拉计划第191题:出勤奖励

本题难度系数为35%&#xff08;5%最易&#xff0c;100%最难&#xff09;。 某所学校给有出勤和守时表现良好的孩子发放现金奖励。如果孩子连续三天缺席&#xff0c;或是有多于一次迟到&#xff0c;则拿不到这份奖励。 根据n天的实际出勤情况&#xff0c;我们可以生成L&#x…

自然语言处理课程第二次作业(隐马尔可夫模型HMM+维特比算法(Viterbi Algorithm)进行词性标注代码实现)

文章目录一、理论描述二、算法描述三、详例描述具体过程分析题目数据预处理转移概率矩阵&#xff1a;发射概率矩阵&#xff1a;HMM维特比算法进行词性标注开始进行词性标注&#xff1a;The&#xff1a;bear&#xff1a;is&#xff1a;on&#xff1a;the&#xff1a;move&#x…
最新文章