代码随想录 | Day25 | 二叉树:从中序与后序遍历构造二叉树最大二叉树

代码随想录 | Day25 | 二叉树:从中序与后序遍历构造二叉树&&最大二叉树

主要学习内容:
用中序和后序来构建二叉树

106.从中序与后序遍历构造二叉树

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

解法思路:

先想想如果没有这个图的话,我们会如何把根据这两个数组把树画出来。

1.中序是左中右,后序是左右中,说明后序数组的末尾肯定是当前还没构造的部分的根结点

2.接下来再根据这个值去中序里面找,找到的话,那它的前面就是左子树,后面就是右子树

3.根据中序数组左子树结点数量,可以确定后序数组中左右的分界,这样就找到了中序和后序数组中,左子树和右子树的范围

4.也就是分别找到了左子树和右子树他们自己的中序和后序数组

5.递归左子树和右子树的中序后序数组,建立左右子树,知道整棵树构建完毕

比如下面,这张图的构造过程

1.先找到根结点3

2.3前面是左子树9,后面是右子树15,20,7

3.左子树大小为1说明,后序数组前面1个数是左子树,到末尾的根结点前是右子树15,7,20

4.左子树中序 :9 后序:9

右子树中序 :15 20 7 后序:15 7 20

5.递归9和9 15 20 7和15 7 20

image-20240927152225450

现在我们了解了大致过程,难点在于

1.我们该如何知道构造完的根结点在哪,即我们的递归函数返回值是什么?

2.递归函数的终止条件又该是什么?

1.我们需要最后返回我们构造的二叉树,所以我们的返回值得是我们构造二叉树的根结点,也是通过函数返回值得到根节点

2.终止条件应该是后序数组为空,后序数组为空说明已经没有结点需要进行构造了、

1.函数参数和返回值

TreeNode *tra(vector<int> i, vector<int> p)

i,p对应当前构造子树的中序和后序数组,返回值TreeNode * 是我们的根结点

2.终止条件

if(p.size()==0) return nullptr;

后序数组为空

3.本层代码逻辑

这部分是最难的地方,我们需要把我们刚刚想象的过程用代码进行复刻、

1.找到当前子树的根结点,就是后序数组的最后一个值

TreeNode *t=new TreeNode(p[p.size()-1]);

2.找到中序数组中左子树和右子树的切分点,即在中序数组中找到根节点,找到根节点的下标位置以后就break

int index=0;
for(index=0;index<i.size();index++)if(i[index]==t->val)break;

3.构造左子树,要注意采用的区间是左闭右闭还是左闭右开,不管用哪种都要统一

我采用的是左闭右开,因为迭代器的begin和end是左闭右开的

我们切割左子树的中序和后序

中序就是从开始到根结点的下标值,[0,index)

后序也是[0,index)

t->left=tra(vector<int>(i.begin(),i.begin()+index),vector<int>(p.begin(),p.begin()+index));

4.构造右子树

我们切割右子树的中序和后序

中序就是从开始到根结点的下标值,[index+1,end),end是只想末尾位置的下一位置的迭代器(可以理解为指针),index+1是因为要把根结点跳过,他不属于子树内容

后序是[index,end-1),因为后序的左右子树直接挨着,而最后一个是根节点,我们一样不要根结点

5.返回根结点

return t;

本层逻辑完整代码:

		TreeNode *t=new TreeNode(p[p.size()-1]);int index=0;for(index=0;index<i.size();index++)if(i[index]==t->val)break;t->left=tra(vector<int>(i.begin(),i.begin()+index),vector<int>(p.begin(),p.begin()+index));t->right=tra(vector<int>(i.begin()+index+1,i.end()),vector<int>(p.begin()+index,p.end()-1));return t;

完整代码:

class Solution {
public:TreeNode *tra(vector<int> i, vector<int> p){if(p.size()==0) return nullptr;TreeNode *t=new TreeNode(p[p.size()-1]);int index=0;for(index=0;index<i.size();index++)if(i[index]==t->val)break;t->left=tra(vector<int>(i.begin(),i.begin()+index),vector<int>(p.begin(),p.begin()+index));t->right=tra(vector<int>(i.begin()+index+1,i.end()),vector<int>(p.begin()+index,p.end()-1));return t;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {return tra(inorder,postorder);}
};

654.最大二叉树

654. 最大二叉树 - 力扣(LeetCode)

解法:

这没啥好说的,就和上一题一模一样,就是从后序找根节点换成找一个数组里面的最大值了。

class Solution {
public:TreeNode *tra(vector<int> nums){//终止条件if(nums.size()==0)return nullptr;//记录最大值下标和最大值int index=0,maxVal=INT_MIN;for(int i=0;i<nums.size();i++)if(nums[i]>maxVal){maxVal=nums[i];index=i;}//构建根节点TreeNode *t=new TreeNode(maxVal);//构建左子树,还是采用左闭右开t->left=tra(vector<int>(nums.begin(),nums.begin()+index));//构建右子树t->right=tra(vector<int>(nums.begin()+index+1,nums.end()));//返回根节点return t;}TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return tra(nums);}
};

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

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

相关文章

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下玩转iSulad容器技术

828华为云征文&#xff5c;华为云Flexus云服务器X实例部署Xnote笔记应用 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、iSulad介绍2.1 iSulad简介2.2 iSulad特点 三、本次实践介绍3.1 本次实践…

亚信安全天穹5分钟勒索体检 免费试用今起上线

对于勒索攻击的认知 你是否还停留在“2.0时代”&#xff1f; 勒索攻击无疑是企业面临的最大威胁&#xff0c;2024年上半年&#xff0c;勒索组织数量同步增长超过50%&#xff0c;勒索攻击数量也持续攀升&#xff0c;平均勒索赎金突破520万美元。 当前&#xff0c;勒索攻击治理…

HTML5实现唐朝服饰网站模板源码

文章目录 1.设计来源1.1 网站首页-界面效果1.2 唐装演变-界面效果1.3 唐装配色-界面效果1.4 唐装花纹-界面效果1.5 唐装文化-界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcL…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 7 推送卡片刷新消息

场景介绍 如今衣食住行娱乐影音应用占据了大多数人的手机&#xff0c;一部手机可以满足日常大多需求&#xff0c;但对需要经常查看或进行简单操作的应用来说&#xff0c;总需要用户点开应用体验较繁琐。针对此种场景&#xff0c;HarmonyOS提供了Form Kit&#xff08;卡片开发服…

如何将泰语入门提高到精通呢?

要精通泰语&#xff0c;需要从基础的字母和发音开始学习&#xff0c;并通过积累词汇、频繁练习口语、沉浸在语言环境中来不断提高。参加在线课程或找专业教师进行系统性学习也很有帮助。此外&#xff0c;利用各种教材和在线资源&#xff0c;以及保持持续和一致的学习态度&#…

Spring Boot 学习之路 -- 处理 HTTP 请求

前言 最近因为业务需要&#xff0c;被拉去研究后端的项目&#xff0c;代码框架基于 Spring Boot&#xff0c;对我来说完全小白&#xff0c;需要重新学习研究…出于个人习惯&#xff0c;会以 Blog 文章的方式做一些记录&#xff0c;文章内容基本来源于「 Spring Boot 从入门到精…

电脑上数据丢了怎么找回来 Win系统误删文件如何恢复

无论是在工作中&#xff0c;还是生活中&#xff0c;电脑都是不可缺少的重要工具&#xff0c;尤其是在工作中&#xff0c;电脑不仅可以高效的完成工作&#xff0c;还可以存储工作中的重要资料。不过在使用电脑的时候&#xff0c;也会遇到数据丢失的情况。针对这一问题&#xff0…

Spring Boot 学习之路 -- 基础认知

前言 最近因为业务需要&#xff0c;被拉去研究后端的项目&#xff0c;代码框架基于 Spring Boot&#xff0c;对我来说完全小白&#xff0c;需要重新学习研究…出于个人习惯&#xff0c;会以 Blog 文章的方式做一些记录&#xff0c;文章内容基本来源于「 Spring Boot 从入门到精…

2024最新gewechat开发微信机器人教程说明

简介&#xff1a;本文将指导你如何搭建一个微信机器人&#xff0c;通过接入gewe框架实现智能回复与聊天功能。我们将从基础设置开始&#xff0c;逐步讲解如何配置机器人&#xff0c;并通过实例展示其实际应用。 随着人工智能技术的不断发展&#xff0c;智能机器人已经成为我们…

Hadoop 常用生态组件

Hadoop核心组件 安装 Hadoop 时&#xff0c;通常会自动包含以下几个关键核心组件&#xff0c;特别是如果使用了完整的 Hadoop 发行版&#xff08;如 Apache Hadoop、Cloudera 或 Hortonworks 等&#xff09;。这些组件构成了 Hadoop 的核心&#xff1a; 1. HDFS&#xff08;H…

基于python+django+vue的旅游景点数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

高密度EEG人脑成像:技术与应用

摘要 EEG是一种非侵入性的人脑神经活动测量技术。随着数字技术的进步&#xff0c;EEG分析已从定性分析幅值和频率调制发展到全面分析记录信号的复杂时空特征。EEG能够在亚秒级的时间范围内测量神经过程&#xff0c;但其空间分辨率较低&#xff0c;这使得难以准确可靠地定位EEG…

批量发送邮件:性能优化与错误处理深度解析

目录 一、批量发送邮件的基础概述 1.1 批量发送邮件的定义 1.2 邮件发送流程 二、性能优化策略 2.1 发送速率控制 2.2 队列管理 2.3 动态IP池管理 2.4 智能调度 三、错误处理机制 3.1 暂时性发送错误处理 3.2 永久性发送错误处理 3.3 邮件反馈收集与分析 四、案例…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(五)-聚合

聚合 聚合基于Query结果的统计&#xff0c;执行过程是搜索的一部分&#xff0c;Onesearch支持0代码构建聚合&#xff0c;聚合目前完全在引擎层 0代码聚合 上图是聚合的配置&#xff0c;包括2个pdm文档聚合统计 termsOfExt term桶聚合&#xff0c;统计ext&#xff0c;如&…

18923 二叉树的直径

### 思路 1. **构建二叉树**&#xff1a; - 使用输入数据构建二叉树。 - 使用一个数组或哈希表来存储每个节点的子节点。 2. **计算直径**&#xff1a; - 使用深度优先搜索&#xff08;DFS&#xff09;计算每个节点的深度。 - 计算每个节点的左子树和右子树的深度…

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

机器学习笔记(一)初识机器学习

1.定义 机器学习是一门多学科交叉专业&#xff0c;涵盖概率论知识&#xff0c;统计学知识&#xff0c;近似理论知识和复杂算法知识&#xff0c;使用计算机作为工具并致力于真实实时的模拟人类学习方式&#xff0c;并将现有内容进行知识结构划分来有效提高学习效率。 机器学习有…

开源ids snort (windows版)

Snort-IPS-on-Windows-main资源-CSDN文库 GitHub - eldoktor1/Snort-IPS-on-Windows: A comprehensive guide to installing and configuring Snort IPS on Windows, ensuring robust network security 手动打造Snortbarnyard2BASE可视化告警平台 - FreeBuf网络安全行业门户 …

银河麒麟桌面操作系统如何添加WPS字体

银河麒麟桌面操作系统如何添加WPS字体 1、使用场景2、操作方法步骤一&#xff1a;下载字体文件步骤二&#xff1a;打开终端步骤三&#xff1a;进入字体文件所在目录步骤四&#xff1a;拷贝字体文件到WPS字体目录步骤五&#xff1a;更新字体缓存步骤六&#xff1a;重启WPS Offic…

【PAM】Linux登录认证限制

PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插拔认证模块&#xff09;是一种灵活的认证框架&#xff0c;用于在 Linux 和其他类 Unix 系统上管理用户的身份验证。PAM 允许系统管理员通过配置不同的认证模块来定制应用程序和服务的认证方式&#xff0c;而不…