leetcode105. 从前序与中序遍历序列构造二叉树,步骤详解附代码

leetcode105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorderinorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
在这里插入图片描述

示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]

算法思路

前序遍历特性:在前序遍历中,第一个元素总是根节点。
中序遍历特性:在中序遍历中,根节点将序列分为左子树和右子树。

具体算法步骤

检查空序列:如果前序序列为空,返回 NULL 表示没有树。

创建根节点:使用前序遍历的第一个元素作为根节点的值,并创建相应的 TreeNode 对象。

确定根节点在中序遍历中的位置:通过遍历中序序列找到根节点的位置,这个位置将中序序列分为左子树和右子树。

划分左右子树的前序和中序序列:根据根节点在中序序列中的位置,划分出左子树和右子树的前序和中序序列。

递归构建子树:对左子树和右子树的序列递归调用 traversal 函数来构建子树,并将结果分别赋给根节点的左右子节点。

返回根节点:完成子树构建后,返回根节点,这样就完成了整棵树的构建。

这里有个注意的点,就是我们先确定中序遍历的数组内容,再确定先序遍历的数组内容,这样的好处是我们可以根据中序数组的长度来确定先序遍历的数组。如果反过来的话会很麻烦,读者可以自己试试。
具体来说
划分左右子树
在中序遍历中,根节点左边的元素构成左子树,右边的元素构成右子树。因此,我们可以通过 del 来划分左右子树的中序遍历序列:
leftInorder 包含了根节点左边的所有元素。
rightInorder 包含了根节点右边的所有元素。

确定前序遍历中的左右子树序列
前序遍历中,根节点后面的元素按照左子树和右子树的顺序排列。因此,我们可以根据 leftInorder 的大小来确定左子树在前序遍历中的序列:
leftPreorder 包含了左子树的所有前序遍历元素。
同理,右子树的前序遍历序列 rightPreorder 可以通过 leftInorder.size() 来确定起始位置。

具体代码

class Solution {
public:TreeNode* traversal(vector<int>& preorder,vector<int>& inorder){if(preorder.size()==0) return NULL;int rootValue=preorder[0];TreeNode* root=new TreeNode(rootValue);if(preorder.size()==1) return root;int del;for(del=0;del<inorder.size();del++){if(inorder[del]==rootValue) break;}vector<int> leftInorder(inorder.begin(),inorder.begin()+del);vector<int> rightInorder(inorder.begin()+del+1,inorder.end());vector<int> leftPreorder(preorder.begin()+1,preorder.begin()+1+leftInorder.size());vector<int> rightPreorder(preorder.begin()+1+leftInorder.size(),preorder.end());root->left=traversal(leftPreorder,leftInorder);root->right=traversal(rightPreorder,rightInorder);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {if(inorder.size()==0 || preorder.size()==0) return NULL;return traversal(preorder,inorder);}
};

做完此题,可以看看姊妹题

leetcode106从中序与后序遍历序列构造二叉树

我也写了详细题解

需要注意的是,只有中序与前序、中序与后序才能确定唯一的二叉树,前序和后序无法确定唯一的二叉树!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu22.04单个网口两个IP

其中 4网段IP可用来上网&#xff0c;3 网段用来内网 界面显示: 配置文件&#xff1a; 01-network-manager-all.yaml 放在 /etc/netplan/ # Let NetworkManager manage all devices on this systemnetwork:version: 2renderer: networkdethernets:eth0:dhcp4: falsedhcp6: …

大学生暑期三下乡社会实践通讯稿怎样投稿?

在这个充满挑战与机遇的暑期,我有幸成为学院暑期三下乡社会实践活动的一员,并肩负起志愿服务团队向媒体投稿宣传报道的重任。起初,面对这项任务,我满怀激情与期待,以为只需凭借一腔热血和手中的笔,就能将实践的点点滴滴生动呈现给世人。然而,现实却给我上了一堂生动的课。 之初…

使用vscode连接开发机进行python debug

什么是debug&#xff1f; 当你刚开始学习Python编程时&#xff0c;可能会遇到代码不按预期运行的情况。这时&#xff0c;你就需要用到“debug”了。简单来说&#xff0c;“debug”就是能再程序中设置中断点并支持一行一行地运行代码&#xff0c;观测程序中变量的变化&#xff…

在线心里咨询系统的设计与实现2024(代码+论文+开题报告+ppt)

下载在最后 技术栈: vuemysqlspringboot 展示: 下载地址: https://download.csdn.net/download/hhtt19820919/89583101 备注: 运行有问题请私信我,私信按钮在文章左边)

鱼哥好书分享活动第28期:看完这篇《终端安全运营》终端安全企业基石,为你的终端安全保驾护航!

鱼哥好书分享活动第28期&#xff1a;看完这篇《终端安全运营》终端安全企业基石&#xff0c;为你的终端安全保驾护航&#xff01; 读者对象&#xff1a;主要内容&#xff1a;本书目录&#xff1a;了解更多&#xff1a;赠书抽奖规则: 在当前网络威胁日益复杂化的背景下&#xff…

nginx转发netty长链接(nginx负载tcp长链接配置)

首先要清楚一点&#xff0c;netty是长链接是tcp连接不同于http中负载在http中配置server监听。长连接需要开启nginx的stream模块(和http是并列关系) 安装nginx时注意开启stream&#xff0c;编译时加上参数 --with-stream &#xff08;其他参数根据自己所需来加&#xff09; …

基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码

第一步&#xff1a;准备数据 5种鸟类行为数据&#xff1a;self.class_indict ["bowing_status", "grooming", "headdown", "vigilance_status", "walking"] &#xff0c;总共有23790张图片&#xff0c;每个文件夹单独放一…

Github个人网站搭建详细教程【Github+Jekyll模板】

文章目录 前言一、介绍1 Github Pages是什么2 静态网站生成工具3 Jekyll简介Jekyll 和 GitHub 的关系 4 Mac系统Jekyll的安装及使用安装Jekyll的简单使用 二、快速搭建第一个Github Pages网站三、静态网站模板——Chirpy1 个人定制 四、WordPress迁移到Github参考资料 前言 23…

Opencv学习项目4——手部跟踪

上一篇博客我们介绍了mediapipe库和对手部进行了检测&#xff0c;这次我们进行手部关键点的连线 代码实现 import cv2 import mediapipe as mpcap cv2.VideoCapture(1) mpHands mp.solutions.hands hands mpHands.Hands() mpDraw mp.solutions.drawing_utilswhile True:…

IDEA-安装插件 驼峰下划线转换

第一步&#xff1a;安装 file-settings-plugins-在marketplace搜索“CamelCase”-点击安装 第二步&#xff1a;设置 file-settings-editor-camel_case 第三步&#xff1a;使用 选中想转换的遍历 使用快捷键 Alt Shift U

Windows环境下安装docker、配置Ubuntu容器并使用vscode ssh连接到容器

目录 一、Windows环境下安装docker二、配置Ubuntu三、在容器中安装ssh服务参考文章 一、Windows环境下安装docker 在任务栏中搜索**“Windows功能”** -将适用于Linux的Windows子系统和虚拟机平台选上 然后按照提示重启电脑。然后开始安装WSL。通过cmd以管理员身份打开命令提…

知识图谱 networkx、pyvis页面简单可视化

参考&#xff1a; https://huggingface.co/learn/cookbook/en/information_extraction_haystack_nuextract networkx 构建保存节点和边&#xff0c;pyvis保存为html 注意点 1、pyvis vscode的jupyer不支持&#xff0c;会显示不正常&#xff0c;直接还是本地jupyter环境使用 2…

【算法】布隆过滤器

一、引言 在现实世界的计算机科学问题中&#xff0c;我们经常需要判断一个元素是否属于一个集合。传统的做法是使用哈希表或者直接遍历集合&#xff0c;但这些方法在数据量较大时效率低下。布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的概率型数据结构&…

二叉树以及堆的实现

树 树的定义及概念 树是⼀种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有⼀个特殊的结点&#xff0c;称…

不支持jdk8的jenkins部署jdk8项目

1、背景 目前最新的jenkins必须基于jdk8以上&#xff0c;才能安装。jenkins最新的插件部分也不支持jdk8了。 2、全局工具配置 配置一个jdk8 配置一个jdk8以上的版本&#xff0c;如jdk17 3、部署maven项目 jdk17项目 可以直接使用maven插件&#xff0c;部署。 jdk8项目 由…

01-调试开发k8s

使用 Docker 构建 Kubernete 官方 release 是使用 Docker 容器构建的。要使用 Docker 构建 Kubernetes&#xff0c;请遵循以下说明: Requirements docker Key scripts 以下脚本位于 build/ 目录中。请注意&#xff0c;所有脚本都必须从 Kubernetes 根目录运行 build/run.…

MySQL环境的配置文件json

突然了解到&#xff0c;使用json文件去进行环境的配置&#xff0c;这样修改参数的时候就只需要去改json文件中的内容&#xff0c;不需要去修改代码中的内容&#xff0c;其他人的MySQL和我的MySQL也不同&#xff0c;这时其他人只需要修改json文件中的内容&#xff0c;清晰明了&a…

代码随想录||day25 非递减子序列,全排列问题

491非递减子序列 力扣题目链接 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#x…

双盲插便携屏方案:LDR6020系列便携显示

在当今这个追求高效与便携的时代&#xff0c;电子设备尤其是便携式显示器&#xff08;Portable Monitor&#xff09;的需求日益增长&#xff0c;成为商务人士、设计师、游戏玩家及移动办公族的理想伴侣。其中&#xff0c;6020系列便携屏以其卓越的显示效果、紧凑的机身设计赢得…

基于YOLO系列便捷式代码创新

目标检测 YOLOv5 与 YOLOv7 系列详细介绍 YOLOv5 详细介绍 版本与特点 网络结构 技术亮点 YOLOv7 详细介绍 主要贡献 网络结构 技术亮点 性能对比 基于YOLOv5和YOLOv7系列的多方面创新方法 融合BiFormer注意力机制 融合SImAM注意力机制 CBAM注意力机制 DBB多分枝模块 LSKA注意力…