​LeetCode解法汇总105. 从前序与中序遍历序列构造二叉树

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

给定两个整数数组 preorder 和 inorder ,其中 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]

提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

解题思路:

1.我们可以通过前序遍历和中序遍历发现一个规律,前序遍历的第一个数字,一定是根结点。然后中序遍历中找到这个根节点,就可以分成左右两份,分别对应左子树和右子树。
2.比如前序遍历是[1,2,3,4],中序遍历是[3,2,1,4],那么1就是根节点,[3,2]就位于根节点的左子树上,[4]位于根节点的右子树上。此时我们就可以构建一个1的节点。
3.我们继续对[4]的部分继续采取上面的分割流程,就可以生成一个4的节点,此时无法继续分割。继续对[2,3]的部分进行分割,则可以生成一个2的节点,然后继续分割。
4.所以,我们可以采取递归的策略,不断的分割,每次分割取出其前序和中序遍历的部分进行下一轮的遍历,直到长度为1,并添加到其左右节点上。就可以得到我们想要的结果。

代码:

class Solution {
public:TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder){TreeNode *node = buildNode(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);return node;}TreeNode *buildNode(vector<int> &preorder, vector<int> &inorder, int preStart, int preEnd, int inStart, int inEnd){int expectValue = preorder[preStart];// inorder.at(expectValue);auto it = find(inorder.begin(), inorder.end(), expectValue);int index = std::distance(inorder.begin(), it);int leftLength = index - inStart;int rightLength = inEnd - index;TreeNode *root = new TreeNode(expectValue);if (leftLength >= 1){root->left = buildNode(preorder, inorder, preStart + 1, preStart + leftLength, inStart, index - 1);}if (rightLength >= 1){root->right = buildNode(preorder, inorder, preEnd - rightLength + 1, preEnd, index + 1, inEnd);}return root;}
};

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

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

相关文章

2024年【N1叉车司机】考试题及N1叉车司机新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机考试题是安全生产模拟考试一点通总题库中生成的一套N1叉车司机新版试题&#xff0c;安全生产模拟考试一点通上N1叉车司机作业手机同步练习。2024年【N1叉车司机】考试题及N1叉车司机新版试题 1、【多选题】…

【Linux系统化学习】动静态库 | 软硬链接

目录 硬链接和软链接 硬链接 软链接 动态库和静态库 静态库 静态库的生成 静态库的使用 将库打包和使用 动态库 动态库的生成 动态库的使用 库搜索路径 硬链接和软链接 硬链接 上篇文章我们说到真正找到磁盘上的文件并不是文件名&#xff0c;而是inode。其实在…

CF1731D Valiant‘s New Map 题解

文章目录 CF1731D Valiants New Map 题解Valiants New Map题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示算法&#xff1a;二分二维前缀和代码&#xff1a; CF1731D Valiant’s New Map 题解 link Valiant’s New Map 题面翻译 给定一个带权值的 n …

Adobe Ai下载安装免费(矢量图形编辑软件Ai安装包下载2024【Windows版】)

Adobe全家桶下载方式 Ae下载 Pr下载 Ai下载 将持续更新~ 文章目录 Adobe全家桶下载方式Ai下载方式【点我获取下载链接】我们的网站一、Ai简介二、链接内容包含1.Ai软件 声明 Ai下载方式【点我获取下载链接】 百度网盘下载&#xff1a;百度网盘下载方式夸克网盘下载&#xff…

Day 6.文件属性和权限的获取

时间获取 1.time time_t time(time_t *tloc); 功能&#xff1a; 返回1907-1-1到现在的秒数&#xff08;格林威治时间&#xff09; 参数&#xff1a; tloc&#xff1a;存放秒数空间的首地址 返回值&#xff1a; 成功返回秒数 失败返回-1 2.localtime struct tm *loca…

Python入门:常用模块—logging模块

logging日志的分级&#xff1a; debug(),info(),warning(),error(),critical() 5个级别 最简单用法 1 2 3 4 import logging logging.warning("user [mike] attempted wrong password more than 3 times") logging.critical("server is down") 输出&…

Day49 647 回文子串 516 最长回文子序列

647 回文子串 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 方法一&#xff1a;动态规划&#xff1a; 采用一个二维的dp数组&#xf…

普中51单片机学习(二)

51单片机介绍 所需基础知识 基础数模电知识&#xff0c;简单的C语言。 PS&#xff1a;如果有不懂的直接通义千问。。。 什么是单片机 在一片集成电路芯片上集成微处理器、存储器、I/O接口电路&#xff0c;从而构成了单芯片微型计算机&#xff0c;即单片机。 学习方法 多实…

Sqoop 入门基础

简介 Sqoop&#xff08;SQL to Hadoop&#xff09;是一个开源工具&#xff0c;用于在关系型数据库和Hadoop之间传输数据。它提供了一种快速高效的方式&#xff0c;将数据从关系型数据库导入到Hadoop集群进行分析&#xff0c;并支持将Hadoop集群中的数据导出到关系型数据库中。本…

【编程】C++语言编程规范-2

编程实践 结合C Effective系列参考树、尤其是工程经验教训的总结。 并发 除非必要&#xff0c;尽量少用线程。多线程编程要守护好内存&#xff0c;使用atomic、mutex、condition variable、future、semaphore、latch、barrier等同步机制避免数据竞争。尽量缩小临界区&#x…

智慧社区管理系统:构建未来的生活模式

在这个信息化、智能化的时代&#xff0c;我们期待的不再是简单的居住空间&#xff0c;而是一个集安全、便捷、舒适、环保于一体的智能化社区。为此&#xff0c;我们推出了全新的智慧社区管理系统&#xff0c;旨在将先进的科技力量引入社区管理&#xff0c;为居民提供更优质的生…

OpenProject + Rocky8安装

文章目录 1、概要2、整体架构流程3、准备4、安装5、openproject 配置5.1、第一步&#xff1a;OpenProject 版本选择5.2、第二步&#xff1a;PostgreSQL 支持5.3、第三步&#xff1a;Apache2 Web 服务器支持5.4、第四步&#xff1a;hostname 支持5.5、 第五步&#xff1a;服务器…

从零学算法172

172.给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * … * 3 * 2 * 1 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;0 解释&#xff1a;3! 6 &#xff0c;不含尾随 0 示例 2&#xff1a; 输入&#xff1a;n 5 输出&…

【Docker】Docker存储卷

文章目录 一、什么是存储卷二、为什么需要存储卷三、存储卷分类四、管理卷Volume创建卷方式一&#xff1a;Volume 命令操作方式二&#xff1a;-v 或者--mount 指定方式三&#xff1a;Dockerfile 匿名卷 操作案例Docker 命令创建管理卷Docker -v 创建管理卷Docker mount 创建管理…

懒加载实践记录

1.原理 懒加载的原理是通过监听用户的浏览行为&#xff0c;当用户滚动到可视区域内时&#xff0c;再进行资源的加载。这样可以避免一次性加载过多的资源&#xff0c;从而减少页面的加载时间和带宽消耗。 2.主要使用场景 懒加载适用于图片较多&#xff0c;页面列表较长(长列表)…

Linux——常用特殊符号介绍

1、# 井号 (comments) 这几乎是个满场都有的符号&#xff0c;除了先前已经提过的"第一行" #!/bin/bash 井号也常出现在一行的开头&#xff0c;或者位于完整指令之后&#xff0c;这类情况表示符号后面的是注解文字&#xff0c;不会被执行。 # This line is comments.…

unity学习(32)——跳转到角色选择界面(父子类问题)

新问题 应该是两个脚本之间缺少继承关系 its children 解决起来很简单&#xff0c;把ResceneScript也绑到canvas上就可以了 。 此时&#xff0c;在账号密码正确的情况下&#xff0c;是可以完成场景切换。 对应的代码如下&#xff1a; TMP_Text d GameObject.FindWithTag(&…

嵌入式Linux学习DAY20

文件io 文件io和标准io的区别&#xff1a; 1.标准io是库函数&#xff0c;是对系统调用的封装 2.文件io是系统的调用&#xff0c;是Linux内核中的函数接口 3.标准io是有缓存的 4.文件io是没有缓存的 操作步骤 打开->读写->关闭 打开文件&#xff1a;open 功能&am…

了解不同颜色油封的用途

在机械领域&#xff0c;油封是保证各种设备平稳运行的关键部件。为什么油封会有很多颜色。本文旨在阐明不同颜色油封的用途及其意义。 油封有多种颜色&#xff0c;包括黑色、棕色、绿色和蓝色等。乍一看&#xff0c;这些颜色似乎只是一种审美选择。然而&#xff0c;它们有更实…

接口测试(postman/jmeter)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是接口测试 通常做的接口测试指的是系统对外的接口&am…