力扣--从前序与中序遍历序列构造二叉树

题目:

思想:

首先先序遍历能确定根节点的值,此时查看该值在中序遍历中的位置(如果索引为i),那么i左侧为左子树,i 右侧为右子树。从中序数组中即可看出左子树结点个数为 i,右子树节点个数为inorder.size()-i-1。也就代表先序数组中除了第一个元素外,先 i 个元素是左子树对应的先序数组元素,后面的元素为右子树对应的先序数组元素。递归的形式就出现啦!如果没想到可以看一下函数的参数。

代码如下:

C++:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {if(preorder.size()==0){return nullptr;}TreeNode* head=new TreeNode;head->val=preorder[0];int idx=find(inorder.begin(),inorder.end(),preorder[0])-inorder.begin();//preorder---左子树vector<int>::const_iterator Firstprel=preorder.begin()+1;vector<int>::const_iterator Secondprel=preorder.begin()+idx+1;vector<int> prel;prel.assign(Firstprel,Secondprel);//preorder---右子树vector<int>::const_iterator Firstprer=preorder.begin()+idx+1;vector<int>::const_iterator Secondprer=preorder.end();vector<int> prer;prer.assign(Firstprer,Secondprer);//inorder---左子树vector<int>::const_iterator Firstinl=inorder.begin();vector<int>::const_iterator Secondinl=inorder.begin()+idx;vector<int> inl;inl.assign(Firstinl,Secondinl);//inorder---右子树vector<int>::const_iterator Firstinr=inorder.begin()+idx+1;vector<int>::const_iterator Secondinr=inorder.end();vector<int> inr;inr.assign(Firstinr,Secondinr);head->left=buildTree(prel,inl);head->right=buildTree(prer,inr);return head;}
};

注意看一下这里的写法:

int idx=find(inorder.begin(),inorder.end(),preorder[0])-inorder.begin();

参考博文:(在inorder中寻找preorder[0]这个元素,返回其索引值)

c++vector查找元素所在的索引下标_vector查找元素索引-CSDN博客 

//preorder---左子树
vector<int>::const_iterator Firstprel=preorder.begin()+1;
vector<int>::const_iterator Secondprel=preorder.begin()+idx+1;
vector<int> prel;
prel.assign(Firstprel,Secondprel);

参考博文:(就是把preorder中的第一个元素直到第idx个元素,复制给prel)

vector 切片,截取指定区间元素_vector截取-CSDN博客

Python:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:if len(preorder)==0:return Nonehead=TreeNode(preorder[0])idx=inorder.index(preorder[0])prel=preorder[1:idx+1]prer=preorder[idx+1:]inl=inorder[:idx+1]inr=inorder[idx+1:]head.left=self.buildTree(prel,inl)head.right=self.buildTree(prer,inr)return head

注意这样几个写法:

Python中的空指针为None

Python中的创建实例

head=TreeNode(preorder[0])

Python中的从inorder中寻找preorder[0],并返回索引

idx=inorder.index(preorder[0])

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

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

相关文章

浅析扩散模型与图像生成【应用篇】(八)——BBDM

8. BBDM: Image-to-Image Translation with Brownian Bridge Diffusion Models 本文提出一种基于布朗桥&#xff08;Brownian Bridge&#xff09;的扩散模型用于图像到图像的转换。图像到图像转换的目标是将源域 A A A中的图像 I A I_A IA​&#xff0c;映射到目标域 B B B中得…

详解事件循环机制

浏览器最主要的进程 &#xff1a; 渲染主线程 如何理解JS的异步 任务没有优先级&#xff0c;但消息队列有优先级 阐述一下JS的事件循环

图书馆管理系统(2)

接下来实现系统的子菜单&#xff0c;在写一个子模块的时候&#xff0c;其他子模块先屏蔽起来&#xff0c;因为没实现&#xff0c;代码运行就通不过 屏蔽起来写上todo&#xff0c;后面(Ctrl键F)搜索&#xff0c;找todo来实现 先来实现图书管理模块 第一步&#xff0c;先要把图…

IDEA 配置文件乱码,项目编码设置

见下图 其中第一二项控制全局以及工程的编码格式&#xff0c;下方的则是 properties 配置文件的格式&#xff0c;统一调整为 UTF-8 后不再乱码

网络原理初识(2)

目录 一、协议分层 1、分层的作用 2、OSI七层模型 3、TCP / IP五层&#xff08;或四层&#xff09;模型 4、网络设备所在分层 5、网络分层对应 二、封装和分用 发送过程&#xff08;封装&#xff09; 1、应用层(应用程序) QQ 2、输入层 3、网络层 4、数据链路层 5、物理…

ai直播数字人!AI大模型应用开发高级技术

AI直播数字人是一种新兴的技术应用&#xff0c;通过AI大模型的应用开发&#xff0c;实现了数字人的虚拟化呈现。数字人作为一种虚拟人物形象&#xff0c;在直播平台或其他媒介中可以展现出真实人物的表情、动作和声音&#xff0c;并且能够与观众进行实时互动&#xff0c;给人带…

视觉slam十四讲学习笔记(七)视觉里程计 2

介绍直接法的原理&#xff0c;并利用 g2o 实现直接法中的一些核心算法。 前言 1. 理解光流法跟踪特征点的原理。 2. 理解直接法是如何估计相机位姿的。 3. 使用 g2o 进行直接法的计算。 哔哩哔哩课程连接&#xff1a;视觉SLAM十四讲ch7_2_哔哩哔哩_bilibili 一、直接法…

django中URL配置和视图渲染

前提&#xff1a; 使用django-admin startproject XXX创建了一个django项目【项目目录为project】 django-admin startproject project 一&#xff1a;控制器配置 在项目的根目录创建一个Controller目录&#xff0c;后续所有的控制器方法都放在此目录下 这里我们在Control…

20240307-2-前端开发校招面试问题整理HTML

前端开发校招面试问题整理【2】——HTML 1、HTML 元素&#xff08;element&#xff09; Q&#xff1a;简单介绍下常用的 HTML 元素&#xff1f; 块状标签&#xff1a;元素独占一行&#xff0c;可指定宽、高。 常用的块状元素有&#xff1a; <div>、<p>、<h1&…

unity学习(50)——服务器三次注册限制以及数据库化角色信息5--角色信息数据库化收尾

上一节内容结束后确实可以写入文件了&#xff0c;但还有两个问题&#xff1a; 1.一个是players.txt中&#xff0c;每次重启服务器&#xff0c;当注册新账号创建角色时&#xff0c;players.txt之前内容都会清空。 2.players.txt之前已经注册3次的账号&#xff0c;新注册的角色…

首发:鸿蒙面试真题分享【独此一份】

最早在23年华为秋季发布会中&#xff0c;就已经宣布了“纯血鸿蒙”。而目前鸿蒙处于星河版中&#xff0c;加速了各大互联网厂商的合作。目前已经有200参与鸿蒙的原生应用开发当中。对此各大招聘网站上的鸿蒙开发需求&#xff0c;每日都在增长中。 2024大厂面试真题 目前的鸿蒙…

使用Java生成JWT(JSON Web Token)的详细指南

介绍 在现代应用程序中&#xff0c;身份验证和授权是至关重要的。JSON Web Token&#xff08;JWT&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式用于在各方之间安全地传输信息。在本文中&#xff0c;我们将学习如何使…

驱动调试第013期-G120XA驱动同步电机应用案例

概述 SINAMICS G120XA是西门子SINAMICS系列变频器的新成员&#xff0c; 功率范围覆盖0.75 kW~560 kW&#xff0c;内置风机和水泵行业应用功能&#xff0c;汇集了优异的高性能矢量控制算法&#xff0c;可以轻松的驱动风机、水泵及压缩机等负载。胜任各种应用场合&#xff0c;专…

Postman 接口自动化测试教程:入门介绍和从 0 到 1 搭建 Postman 接口自动化测试项目

关于Postman接口自动化测试的导引&#xff0c;全面介绍入门基础和从零开始搭建项目的步骤。学习如何有效地使用Postman进行API测试&#xff0c;了解项目搭建的基础结构、环境设置和测试用例的编写。无论您是新手还是经验丰富的测试人员&#xff0c;这篇教程都将为您提供清晰的指…

pycuda安装失败问题

pycuda安装失败问题 遇到一个pycuda安装失败的问题&#xff0c; 这里有一个合理的解释可以去尝试一下&#xff0c;看起来很有道理&#xff1a;

MySQL为什么要用B+树?

二叉树&#xff08;二叉查找树&#xff09; 平衡二叉树&#xff08;B树就是B-树&#xff09;(解决了二叉查找树的极端情况&#xff09; Q&#xff1a;具体是怎么解决的呢&#xff1f; A&#xff1a; 树左右两边层数相差不大于1一旦符合条件1的时候&#xff0c;就进行左旋/右…

无法更新下载安装升级谷歌浏览器Chrome无法更新至最新版本怎么解决下载更新谷歌浏览器?

谷歌Chrome浏览器有新版本chrome可用&#xff0c;点击后无法更新chrome至最新版本&#xff0c;造成每次在电脑上打开谷歌chrome浏览器都会提示更新&#xff0c;重新安装chrome又无法打开谷歌浏览器官方网站。 谷歌浏览器Chrome无法更新至最新版本怎么办&#xff1f; 1、百度搜…

System Verilog学习笔记(十八)——线程控制

线程控制 发生器把激励传给代理时&#xff0c;环境类需要知道发生器什么时候完成任务&#xff0c;以便及时终止测试平台中还在运行的线程&#xff0c;这个过程就需要借助线程间的通信来完成。常用的线程间通信有事件控制、wait语句、SV信箱和旗语等。 Verilog对语句有两种分组…

Numpy 数组转换为 Pandas DataFrame

参考&#xff1a;Convert Numpy Array to Pandas DataFrame Numpy 介绍 Numpy是Python中一个非常强大的科学计算库&#xff0c;它提供了许多高效的数组操作方法。Pandas是另一个重要的数据处理库&#xff0c;它基于Numpy&#xff0c;并提供了更高级别的数据分析和处理工具。在…

SMT贴片加工——品质检验要求

一、元器件贴装工艺品质要求 1.元器件贴装需整齐、正中&#xff0c;无偏移、歪斜 2.贴装的元器件型号规格应正确&#xff1b;元器件应无漏贴、错贴 3.贴片元器件不允许有反贴 4.有极性要求的贴片器件安装需按正确的极性标示安装 二、元器件焊锡工艺要求 1.FPC板面应无影响…