算法:利用前序序列和中序序列构造二叉树

题目

链接:leetcode链接

在这里插入图片描述


思路分析

前序遍历的顺序是:根 + 左子树 + 右子树
中序遍历的顺序是: 左子树 + 根 + 右子树

所以,我们可以通过前序遍历获得二叉树的根
可以通过中序遍历去分割二叉树,将二叉树分割成 左子树 根 右子树
然后递归操作即可。

遍历前序序列,前序序列中的每一个元素都是一颗子树的根节点

所以,我们需要一个变量i来遍历前序序列,注意,在递归中,我们需要引用或者指针来传递该参数

找到根节点之后,在中序遍历中去寻找这个根节点,就可以将中序遍历分成三段了。

然后递归调用即可。

注意:有一点比较坑,就是如何去处理空树,当我们要分割后的区间的长度为0的时候就是空树,在具体代码中,我们采用了区间的起始下标和结尾下标
当 起始下标 > 结尾下标 的时候,就出现了空树,返回nullptr即可


代码

TreeNode* build(vector<int>& preorder, vector<int>& inorder,int& prei,int inbegin,int inend){if(inbegin > inend)return nullptr;TreeNode* root = new TreeNode(preorder[prei]);int begin = inbegin,end = inend;int rooti = 0;while(begin <= end){if(inorder[begin] == root->val){rooti = begin;break;}begin++;}prei++;root->left = build(preorder,inorder,prei,inbegin,rooti-1);root->right = build(preorder,inorder,prei,rooti+1,inend);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int i = 0;return build(preorder,inorder,i,0,inorder.size() - 1);}

变式题

题目:利用中序序列和后序序列构造二叉树

链接:leetcode链接

在这里插入图片描述


思路分析

和上面一样,思路大致相同

后序遍历找根(根在后面)
中序遍历分割子树

后序遍历的顺序是 左子树 + 右子树 + 根

与上面不同的是,

  1. 我们需要从后向前遍历后序遍历,i需要一直–
  2. 我们在构建好根节点之后,我们需要接着构造右子树,而并非左子树。

其余与上面几乎相同

代码

TreeNode* build(vector<int>& inorder,vector<int>& postorder,int& posti,int inbegin,int inend){if(inbegin > inend)return nullptr;TreeNode* root = new TreeNode(postorder[posti]);//后序遍历找根int begin = inbegin,end = inend;int rooti = 0;while(begin <= end)//中序遍历分割{if(inorder[begin] == root->val){rooti = begin;}begin++;}if(begin > end){cout << "很抱歉,中序序列和后序序列不匹配" << endl;exit(1);}posti--;root->right = build(inorder,postorder,posti,rooti+1,inend);root->left = build(inorder,postorder,posti,inbegin,rooti-1);return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int i = postorder.size() - 1;return build(inorder,postorder,i,0,inorder.size() - 1);}

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

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

相关文章

偷懒总结篇|贪心算法|动态规划|单调栈|图论

由于这周来不及了&#xff0c;先过一遍后面的思路&#xff0c;具体实现等下周再开始详细写。 贪心算法 这个图非常好 122.买卖股票的最佳时机 II(妙&#xff0c;拆分利润) 把利润分解为每天为单位的维度&#xff0c;需要收集每天的正利润就可以&#xff0c;收集正利润的区间…

HarmonyOS ArkTS与C++数据类型转换

1. HarmonyOS ArkTS与C数据类型转换 本文介绍了C与TS各自数据类型与互相之间的数据类型转换&#xff0c;在需要使用C模块时可以快速上手对各种数据类型进行转换。 1.1. 概述 HarmonyOS的主力开发语言是ArkTS&#xff0c;也提供了C语言的支持&#xff0c;对于一些能力&#xff…

1.3 面向对象 C++面试问题

1.3.1 简述一下什么是面向对象,面向对象与面向过程的区别 什么是面向对象 面向对象&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它通过将现实世界中的实体抽象为“对象”来组织代码。面向对象编程关注对象及其交互&#x…

D51【python 接口自动化学习】- python基础之模块与标准库

day51 模块的导入 学习日期&#xff1a;20241027 学习目标&#xff1a;模块与标准库 -- 66 模块的导入&#xff1a;如何使用其他人编写好的代码功能&#xff1f; 学习笔记 模块的作用 导入模块的方法 # 导入模块 # 方式一 import os # 获取当前的位置 print(os.getcwd())# …

arduino uno R3更换328pb-au芯片,烧录bootloader

使用usbasp烧录器进行烧录&#xff0c;解压 【免费】usbsap驱动以及软件资源-CSDN文库 安装驱动 然后打开软件 界面如下 1按步骤选中芯片&#xff0c; ATmega328P&#xff08;由于没有328PB&#xff0c;直接选这个也行&#xff09; 2查看spi接线&#xff0c; 3读取芯片id&a…

【SpringCloud】07-分布式事务与Seata

1. 分布式事务 2. Seata 3. 安装seata 配置数据库 CREATE DATABASE IF NOT EXISTS seata /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTIONN */; USE seata;------------------------------- The script used when storeM…

加强版 第一节图像二值化定义

本节课介绍了图像又彩色图像转变为彩色图像转变为灰度图像转变为黑色图像的转化过程。 灰度图像-单通道-取值范围为0-255 二值图像-单通道-取值0&#xff08;黑色&#xff09;-255&#xff08;白色&#xff09; 二值分割 有五种分割方式 如图所示 第一种&#xff1a;大于…

RabbitMQ 高级特性——事务

文章目录 前言事务配置事务管理器加上Transactional注解 前言 前面我们学习了 RabbitMQ 的延迟队列&#xff0c;通过延迟队列可以实现生产者生产的消息不是立即被消费者消费。那么这篇文章我们将来学习 RabbitMQ 的事务。 事务 RabbitMQ 是基于 AMQP 协议实现的&#xff0c;…

「C/C++」C/C++标准库之#include <cmath>数学库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

认识线程 — JavaEE

目录 认识线程&#xff08;Thread&#xff09; 1 线程是什么? 2 为什么要有线程 3 进程和线程的区别 区别一 区别二 区别三 区别四 4. Java的线程和操作系统线程的关系 认识线程&#xff08;Thread&#xff09; 1 线程是什么? 一个线程就是一个 "执行流"。…

Excel-多表数据查找匹配(VLOOKUP)

&#x1f496;简介 Excel的VLOOKUP函数同样可以用来查找表格中的数据。VLOOKUP&#xff08;垂直查找&#xff09;是一个非常有用的函数&#xff0c;它可以在一个表格或数据表的一列中搜索特定的值&#xff0c;并返回与之在同一行上的另一列中的值。 &#x1f4d6;环境 WPS …

R语言机器学习算法实战系列(十二)线性判别分析分类算法 (Linear Discriminant Analysis)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍LDA的原理LDA的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve保存模型总结优点:缺…

【大数据学习 | kafka】producer的参数与结构

1. producer的结构 producer&#xff1a;生产者 它由三个部分组成 interceptor&#xff1a;拦截器&#xff0c;能拦截到数据&#xff0c;处理完毕以后发送给下游&#xff0c;它和过滤器不同并不是丢弃数据&#xff0c;而是将数据处理完毕再次发送出去&#xff0c;这个默认是不…

【c++篇】:探索c++中的std::string类--掌握字符串处理的精髓

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.std::string对象的创建二.std::string对象的访问三.std::str…

读取有空格的string对象(getline)

文章目录 读取有空格的string对象1.使用标准库中的iostream来写2.**使用getline读取一整行** 读取有空格的string对象 1.使用标准库中的iostream来写 #include<iostream> using namespace std; int main() {string s;cin >> s;cout << s << endl;ret…

探索Python安全字符串处理的奥秘:MarkupSafe库揭秘

文章目录 探索Python安全字符串处理的奥秘&#xff1a;MarkupSafe库揭秘第一部分&#xff1a;背景介绍第二部分&#xff1a;MarkupSafe是什么&#xff1f;第三部分&#xff1a;如何安装MarkupSafe&#xff1f;第四部分&#xff1a;MarkupSafe的简单使用方法1. 使用escape函数2.…

Tomcat安装与使用

Tomcat优点 1、开源免费&#xff1a;是一个免费、开源的Web服务器&#xff0c;可以在任何环境下自由使用&#xff0c;无需支付任何费用。 2、轻量级&#xff1a;是一个轻量级的Web服务器&#xff0c;其核心仅有几百K&#xff0c;启动速度非常快。 3、易于安装和配置&#xff1a…

【笔记】LLM位置编码之标准位置编码

标准位置编码 起源原理证明&#xff1a;对于任何固定的偏移量 k k k&#xff0c; P E p o s k PE_{posk} PEposk​可以表示为 P E p o s PE_{pos} PEpos​的线性函数。计算 P E p o s k 与 P E p o s PE_{posk} 与PE_{pos} PEposk​与PEpos​的内积结论 通俗理解缺点 起源 由…

深度学习之降维和聚类

1 降维和聚类 1.1 图解为什么会产生维数灾难 ​ 假如数据集包含10张照片&#xff0c;照片中包含三角形和圆两种形状。现在来设计一个分类器进行训练&#xff0c;让这个分类器对其他的照片进行正确分类&#xff08;假设三角形和圆的总数是无限大&#xff09;&#xff0c;简单的…

Typora一款极简Markdown文档编辑器和阅读器,实时预览,序列号生成!免费!最新可用!

文章目录 一、Typora下载和安装二、Typora序列号生成 Typora是一款Markdown编辑器和阅读器&#xff0c;风格极简&#xff0c;实时预览&#xff0c;所见即所得&#xff0c;支持MacOS、Windows、Linux操作系统&#xff0c;有图片和文字、代码块、数学公式、图表、目录大纲、文件管…