java二叉树合并_Java(树的前中后序遍历构造二叉树题型整合)前序和中序、中序和后序、前序和后序遍历序列构造二叉树算法整合归纳...

前言

二叉树各种花里胡哨的算法题真的把我搞晕了,今天特地整理出一类有关二叉树的算法题,希望能帮助阅读到此文章的人,今后不再受此类题型的困扰。

一、题目类型

已知二叉树的两种遍历序列,请根据该序列构建二叉树;

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

前序遍历 preorder = [3,9,20,15,7]

中序遍历 inorder = [9,3,15,20,7]

力扣105题

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

中序遍历 inorder = [9,3,15,20,7]

后序遍历 postorder = [9,15,7,20,3]

力扣106题

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

前序遍历 inorder = [1,2,4,5,3,6,7]

后序遍历 postorder = [4,5,2,6,7,3,1]

力扣889题

二、题型规律

规律啥的基本上大家都看的出来,无非就是根据手握两种遍历序列,去构建二叉树。

这题的变化点个人感觉就是给你的遍历序列,可能是字符串,可能是数组,也可能是集合,那么中间就还存在一个把序列给转换成方便我们使用的状态,例如字符串通过正则分割,然后转换为数组啥的(本文章的遍历序列是数组形式),过分点就是二叉树的结点类也要你自己写。那么节点类就这么写↓

public class TreeNode {

int val;

TreeNode left;

TreeNode right;

TreeNode(int x) { val = x; }

}

三、解题套路

1.明确序列分工(结点构建序列,左右子结点判断序列)

题目给了两个序列,我们得先明确,两个序列分别做什么工作。

第一,构建一棵二叉树一般都是从根节点开始往下构建子树(我目前没见过从子树开始往上构建到根节点的情况,但不知道有没有,话不敢说绝对,嘿嘿),既然要从根节点开始往下构建,那我们就需要一个能从根节点开始往下读取子节点的序列,符合这个要求的序列有前序遍历和后序遍历(后序遍历你倒着来看,就相当于一个改版的前序遍历:根,右,左);

第二,我们还需要一个序列,来确定我们读取的结点到底是左结点还是右结点。此时我们就需要中序遍历,如果没有中序遍历,就用后续遍历;

总结:结点构建序列:前序、后序;左右子结点判断序列:中序、后序;

2.构建结点下标查询表

将左右子结点判断序列每个节点存入哈希表中,方便我们查询下标

3.根据结点构建序列逐个构建结点(递归实现)

然后按照结点构建序列逐个构建结点,通过左右子节点判断序列判断当前构建的结点属于左结点还是右结点;

四、代码实现

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

class Solution {

Map map = new HashMap<>();

int index = 0;

public TreeNode buildTree(int[] preorder, int[] inorder) {

for(int i = 0; i < inorder.length; i++){

map.put(inorder[i], i);

}

return build(0, preorder.length - 1, preorder);

}

public TreeNode build(int left, int right, int[] preorder){

if(left > right) return null;

int mid = map.get(preorder[index]);

TreeNode root = new TreeNode(preorder[index]);

index++;

root.left = build(left, mid - 1, preorder);

root.right = build(mid + 1, right, preorder);

return root;

}

}

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

class Solution {

Map map = new HashMap<>();

int index = 0;

public TreeNode buildTree(int[] inorder, int[] postorder) {

for(int i = 0; i < inorder.length; i++){

map.put(inorder[i], i);

}

index = postorder.length - 1;

return build(0, postorder.length - 1, postorder);

}

public TreeNode build(int left, int right, int[] postorder){

if(left > right) return null;

int mid = map.get(postorder[index]);

TreeNode root = new TreeNode(postorder[index]);

index--;

root.left = build(left, mid - 1, postorder);

root.right = build(mid + 1, right, postorder);

return root;

}

}

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

class Solution {

Map map = new HashMap<>();

int index = 0;

public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {

for(int i = 0; i < postorder.length; i++){

map.put(postorder[i], i);

}

return build(0, postorder.length - 1, preorder);

}

public TreeNode build(int left, int right, int[] preorder){

if(left > right || index >= preorder.length) return null;

TreeNode root = new TreeNode(preorder[index]);

index++;

if(index < preorder.length && left < right){

int mid = map.get(preorder[index]);

root.left = build(left, mid, preorder);

root.right = build(mid + 1, right - 1, preorder);

}

return root;

}

}

总结

观察三种题型的解题代码,其实有很多相同之处,唯独后序遍历的递归算法有稍微一些变形,这三个代码可以一起理解,勤加练习,这类题型问题就不大了

本文分享 CSDN - 弹弹霹雳。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx https透明代理_Nginx反向代理https,配置lets-encrypt证书教程

前言本站也终于迁移到https了&#xff0c;由于全Docker部署&#xff0c;迁移过程中真是艰难无比&#xff08;wordpress那块被折腾的想放弃了&#xff09;,也欢迎访问本人博客&#xff0c;&#xff08;知乎的排版有些乱&#xff09;Nginx反向代理https&#xff0c;配置lets-encr…

nginx 一个请求发给多台机器_配置Nginx实现负载均衡

企业在解决高并发问题时&#xff0c;一般有两个方向的处理策略&#xff0c;软件、硬件&#xff0c;硬件上添加负载均衡器分发大量请求&#xff0c;软件上可在高并发瓶颈处&#xff1a;数据库web服务器两处添加解决方案&#xff0c;其中web服务器前面一层最常用的的添加负载方案…

怎么用记事本写java_如何用记事本写下第一个Java程序-Fun言

在刚学java的时候&#xff0c;刚开始并未接触类似于Myeclipse这类的编辑器&#xff0c;都是用记事本编写程序&#xff0c;这样虽然很慢&#xff0c;但是能让我们明白其中的原理&#xff0c;所以今天来教大家用记事本来写第一个java程序"Hello World&#xff01;"准备…

python中list是什么类型_Python中的list数据类型

创建列表sample_list [a,1,(a,b)]Python 列表操作sample_list [a,b,0,1,3]得到列表中的某一个值value_start sample_list[0]end_value sample_list[-1]删除列表的第一个值del sample_list[0]在列表中插入一个值sample_list[0:0] [sample value]得到列表的长度list_length …

pythonhash加密_Python字符串hashlib加密模块使用案例

主要用于对字符串的加密&#xff0c;最常用的为MD5加密&#xff1a;import hashlibdef get_md5(data):obj hashlib.md5()obj.update(data.encode(utf-8))result obj.hexdigest()return resultval get_md5(123) #这里放入要加密的字符串文字。print(val)#简便的写法&#xff…

python网络爬虫资源库名_Python网络爬虫

网友NO.524767Python网络爬虫与信息提取(实例讲解)课程体系结构&#xff1a; 1、Requests框架&#xff1a;自动爬取HTML页面与自动网络请求提交 2、robots.txt:网络爬虫排除标准 3、BeautifulSoup框架&#xff1a;解析HTML页面 4、Re框架&#xff1a;正则框架&#xff0c;提取页…

静态成员 java_JAVA中的静态成员

//Java中的静态成员/**静态的成员变量是属于类的&#xff0c;不属于某个对象,是共享的。* 访问时可以用类名.静态属性直接访问&#xff0c;也可以用对象.访问&#xff0c;后者不提倡。* 静态的成员方法只能访问静态的成员*/class Point{static int age ; //所有人共用agestatic…

python骨灰技巧_Pandas技巧,某骨灰级Pythoner经验总结,呕心沥血!

原标题&#xff1a;Pandas技巧&#xff0c;某骨灰级Pythoner经验总结&#xff0c;呕心沥血&#xff01;Python已迅速发展为数据科学家必备的编程语言。python作为一种编程语言提供了更加优秀、宽阔的生体系统与深度的科学计算库。在科学计算库中&#xff0c;Pandas对数据科学最…

java课外兴趣小组管理系统_课外兴趣小组活动方案

课外活动在一定程度上可以开发孩子们的兴趣和天赋&#xff0c;下面是学习啦小编为你整理的课外兴趣小组活动方案&#xff0c;希望对你有用!课外兴趣小组活动方案1一、指导思想&#xff1a;为致力学校内涵式发展&#xff0c;全面推进素质教育&#xff0c;促进学生的全面发展和健…

软件项目周报_有关细节、效率、周报和扯淡

1、有关细节聊聊工作中的细节。有两个视角&#xff0c;「下属」和「上级」。大部分人同时有这两个角色&#xff0c;但屁股转变就有不同看法。对于下属来说&#xff0c;细节是自己的事&#xff0c;上级管得多会很让人烦&#xff0c;而且觉得这个上级很无能&#xff0c;只会盯着细…

java修改配置文件参数_在java类中获取在.properties配置文件中设置的参数

如何获取.properties配置文件中的参数&#xff0c;我在网上查了半天没弄明白&#xff0c;后来在以前的项目中找到了&#xff0c;就写下来&#xff0c;避免遗忘。1.配置文件&#xff1a;message_product.propertiestotal_product2service11,新股发行短信提醒服务,发行的详细信息…

ps发光插件_PS插件自定义区域发光真实辉光插件 Oniric Glow Generator for Photoshop【资源分享1444】...

AE特效PR剪辑C4D影视后期全世界只有不到1%的人关注了你是个很特别的人AE影视后期定期推送「AEPRC4D 影视特效合成 婚庆剪辑调色 电视广告包装 微电影制作 SpeedGrade达芬奇专业调色 摄影等」打造影视后期高端学习平台影视后期 ID&#xff1a;AEPRC4D9【PS插件信息】非常棒的一款…

java按时间范围过滤_在Java中,如何仅选择或过滤在特定时间段内创建的文件

谢谢Ben&#xff0c; Nicolas-R&#xff0c; Basil-Bourque。通过所有输入(使用listFiles&#xff0c;更改过滤器逻辑和使用joda)&#xff0c;这就是我最终制作的&像魅力的工作&#xff1a;File directory new File(fileLoc);FileFilter filter new FileFilter() {public…

python 退出_如果读完这篇文章不能让你入门Python,那我将永久退出编程界

(PS:文末福利赠送 无套路&#xff0c;真实有效&#xff01;)Python是一种动态解释型的编程语言。Python可以在Windows、UNIX、MAC等多种操作系统上使用&#xff0c;也可以在Java、.NET开发平台上使用。【特点】1 Python使用C语言开发&#xff0c;但是Python不再有C语言中的指针…

java 求最长重复子串_给定一个字符串,求出其最长的重复子串。

#include #include #include #include using namespace std;//给定一个字符串,求出其最长的重复子串//方法一string lsubstr_1(const string & str){vector vs;for (int i 0; i < str.size(); i)vs.push_back(str.substr(i));sort(vs.begin(), vs.end());int max 0;in…

unity 检测文本有没有自动换行_python3从零学习-5.1.5、文本自动换行与填充模块textwrap...

TextWrapper 模块提供了一些快捷函数&#xff0c;以及可以完成所有工作的类 TextWrapper 如果你只是要对一两个文本字符串进行自动换行或填充&#xff0c;快捷函数应该就够用了&#xff1b;否则的话&#xff0c;你应该使用 TextWrapper 的实例来提高效率。…

java英文版怎么汉化_请问,java中,将下面的英文名字变为中文 该怎样输出?

如题&#xff0c;下面是代码——————————————————————————————importjava.io.*;publicclassRandomFileDemo{publicstaticvoidmain(String[]args)throwsException{Em...如题&#xff0c;下面是代码————————————————————————…

python建立多台电脑共用的_用virtualenv建立多个Python独立虚拟开发环境

用virtualenv创建虚拟环境&#xff0c;是通过复制全局的python解释器&#xff0c;达到环境的互不影响&#xff1b;新建的虚拟环境会自动复制python解释器环境保存到当前路径之下&#xff1b;3、virtualenv虚拟环境&#xff1a;activate #进入虚拟环境进入虚拟环境&#xff1a;d…

java引入bean代码_通过java代码装配bean

importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;/** Spring 的组件扫描默认是不启用的&#xff0c;需要显式配置启用组件扫描去寻找被 Compon…

红黑树和平衡二叉树的区别_一文搞懂红黑树

文章参考 | https://segmentfault.com/a/1190000012728513前言当在10亿数据进行不到30次比较就能查找到目标时&#xff0c;不禁感叹编程之魅力&#xff01;二叉树在了解红黑树之前&#xff0c;先要了解二叉树&#xff0c;又叫二叉查找树、二叉搜索树、二叉排序树。二叉树顾名思…