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

news2024/11/23 17:28:54

目录链接:

力扣编程题-解法汇总_分享+记录-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.coloradmin.cn/o/1461215.html

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

相关文章

js 多对象去重(多属性去重)

需求中发现后端可能没有处理重复数据&#xff0c;这个时候前段可以直接解决。 在 JavaScript 中&#xff0c;可以使用 Set 数据结构来进行多对象的去重。Set 是 ES6 新引入的集合类型&#xff0c;其特点是元素不会重复且无序。 下面是一个示例代码&#xff0c;展示如何通过 S…

python基础教程—总结篇

这篇是Python基础教程系列的总结篇&#xff0c;这里这个专栏的地址&#xff1a;《Python教程》 首先必须声明一点&#xff0c;这是基础教程&#xff0c;所以面向的是新人&#xff0c;没有学过Python的同学&#xff0c;所以这套教程并没有涉及到比较难的并发编程模块&#xff0…

【Git教程】(二)入门 ——关于工作区与版本库、版本提交、查看信息、克隆、推送与拉回的简单介绍 ~

Git教程 入门 1️⃣ 准备Git 环境1.1 创建版本库1.2 首次提交1.3 显示历史 2️⃣ Git 的协作功能2.1 克隆版本库2.2 从另一版本库中获取修改2.3 从任意版本库中取回修改2.4 创建共享版本库2.5 用 push 命令上载修改2.6 Pull 命令&#xff1a;取回修改 &#x1f33e; 总结 如果…

GitHub使用记录

1.创建仓库 2.删除仓库 翻到最下面 3.将本地文件同步到云端库上 Github——git本地仓库建立与远程连接&#xff08;最详细清晰版本&#xff01;附简化步骤与常见错误&#xff09;_将本地仓库与远程仓库关联-CSDN博客 第三步参考&#xff1a;Github——git本地仓库建立与远程连…

聚道云软件连接器:高科技企业财务自动化,提升效率准确性!

客户介绍&#xff1a; 某互联信息技术有限公司是一家专业从事信息技术服务的高科技企业&#xff0c;在业内享有较高的知名度和影响力。近年来&#xff0c;公司业务快速发展&#xff0c;对信息化建设提出了更高的要求。 客户痛点&#xff1a; 在传统情况下&#xff0c;该公司的…

XML Map 端口进阶篇——常用关键字和格式化器详解

XML Map 端口是用于在不同XML之间建立关系映射的工具&#xff0c;允许通过拖拽操作实现源XML和目标 XML之间的数据字段映射&#xff0c;除此之外&#xff0c;XML Map 端口还提供了其它丰富多彩的功能&#xff0c;使用户能够更加灵活和高效的处理XML 数据映射任务&#xff0c;让…

Ubuntu20.04安装Carla0.9.15

文章目录 环境要求下载Carla解压Carla运行Carla测试官方用例创建python环境安装依赖包案例&#xff1a;生成车辆案例&#xff1a;测试自动驾驶 参考链接 环境要求 系统配置要求&#xff1a; 至少3G显存的GPU&#xff0c;推荐3060及以上的显卡进行Carla拟真。预留足够的硬盘空…

Maxwell - 增量数据同步工具

前言 今天来学习一个新的大数据小工具 Maxwell &#xff0c;它和 Sqoop 很像。Sqoop主要用于在 Hadoop &#xff08;比如 HDFS、Hive、HBase 等&#xff09;和关系型数据库之间进行数据的批量导入和导出&#xff0c;而 Maxwell 则主要用于监控数据库的变化&#xff08;通过监控…

Linux内核解读

来自鹅厂架构师 作者&#xff1a;aurelianliu 工作过程中遇到的调度、内存、文件、网络等可以参考。 1.os运行态 X86架构&#xff0c;用户态运行在ring3&#xff0c;内核态运行在ring0&#xff0c;两个特权等级。 &#xff08;1&#xff09;内核、一些特权指令&#xff0c;例…

【实战 JS逆向+python模拟获取+Redis token会话更新】实战模拟测试 某巴批发网 仅供学习

逆向日期&#xff1a;2024.02.20 使用工具&#xff1a;Node.js、python、Redis 加密方法&#xff1a;md5标准库 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标…

旧物回收小程序开发,开启绿色生活新篇章

随着科技的发展和人们生活水平的提高&#xff0c;物质生活的丰富带来了大量的废弃物。如何合理处理这些废弃物&#xff0c;实现资源的再利用&#xff0c;已成为社会关注的焦点。旧物回收小程序的开发与应用&#xff0c;为这一问题提供了有效的解决方案。本文将探讨旧物回收小程…

Python学习笔记——自定义函数(基础知识)

自定义函数非常简洁有效地实现了代码的复用&#xff0c;让程序编写、阅读、测试和修改变得更加容易。 下面记录Python自定义函数的使用。 1、定义函数&#xff1a; def describe_pet(pet_name,animal_typedog):显示宠物的信息print(f"\nI have a {animal_type}.")…

备战蓝桥杯---数学之矩阵快速幂基础

我们先不妨看一道题&#xff1a; 看见n的数据范围就知道直接按以前的递归写肯定狗带&#xff0c;那我们有什么其他的方法吗&#xff1f; 下面是分析&#xff1a; 我们就拿斐波那契数列试试手吧&#xff1a; 下面是AC代码&#xff0c;可以当作模板记&#xff1a; #include<b…

Android 基础技术——Framework

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 Framework 简述 Android 系统启动流程 当按电源键触发开机&#xff0c;首先会从 ROM 中预定义的地方加载引导程序 BootLoader 到 RAM 中&#xff0c;并执行 BootLoader 程序启动 Linux Kernel&…

2.20 Qt day1

一. 思维导图 二. 消化常用类的使用&#xff0c;以及常用成员函数对应的功能 按钮类QPushButton&#xff1a; mywidget.h&#xff1a; #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include<QPushButton>//按钮类 #include<QIcon>class MyW…

vscode 插件 Marp for VS Code 制作 ppt

话不多说&#xff0c;直接上图 用它来写幻灯片&#xff0c;简直不要太好用&#xff0c;如果你一直使用 markdown 语法写笔记的话&#xff0c;那么做 ppt 对你来说简直就是喝水&#xff1b; 在vscode 上面直接装一个Marp for VS Code插件就可以了 基本使用方法步骤 crtl win …

Flutter自定义tabbar任意样式

场景描述 最近在使用遇到几组需要自定义的tabbar或者类似组件&#xff0c;在百度查询资料中通常&#xff0c;需要自定义 TabIndicator extends Decoration 比如上图中的带圆角的指示器这样实现 就很麻烦&#xff0c; 搜出来的相关也是在此之处上自己画&#xff0c;主要再遇…

OpenLDAP接入NineData SSO

本文面向使用 OpenLDAP 管理人员账户信息的企业&#xff0c;提供将 OpenLDAP 接入单点登录&#xff08;SSO&#xff09;的最佳实践指南&#xff0c;以实现统一认证和授权管理。通过集成 OpenLDAP、phpLDAPadmin、Keycloak&#xff0c;您可以轻松通过 SSO 功能登录 NineData。 …

Android13 编译ninja failed with: exit status 137

描述 现象很奇怪&#xff0c;主机是ubuntu 18.04&#xff0c; 内存有32G&#xff0c;并且系统中有两份Android13代码&#xff0c; 有一份编译正常&#xff0c;另外一份编译不正常&#xff0c;一度以为是因为下载源码不齐全导致&#xff0c;后面仔细看日志&#xff0c;原来是内…

压缩感知(Compressed Sensing)的MATLAB仿真实现

在前一篇文章&#xff1a;正交匹配追踪&#xff08;Orthogonal Matching Pursuit, OMP&#xff09;的MATLAB实现中&#xff0c;我们介绍了针对稀疏信号进行压缩感知的MATLAB仿真。 本篇我们介绍一下针对的是原始的非稀疏信号&#xff0c;看看如何进行处理。 本文中&#xff0c;…