LeetCode题练习与总结:从前序与中序遍历序列构造二叉树--105

news2024/11/19 19:23:59

一、题目描述

给定两个整数数组 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]

提示:

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

二、解题思路

 这个问题是关于如何根据给定的先序遍历和中序遍历数组来重建二叉树。我们可以使用递归方法来解决这个问题。

算法步骤:

  1. 首先,在先序遍历数组preorder中找到根节点的值。
  2. 然后,在inorder数组中找到根节点的值,并以此为界将inorder数组分为左右两部分。
  3. 递归地构造左子树和右子树。
  4. 左子树的preorder数组为preorder数组中根节点后面的所有值,左子树的inorder数组为inorder数组中左子树部分的所有值。
  5. 右子树的preorder数组为preorder数组中根节点后面的所有值,右子树的inorder数组为inorder数组中右子树部分的所有值。
  6. 重复上述步骤,直到所有节点都被处理。

三、具体代码

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder == null || inorder == null) {
            return null;
        }
        return helper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
    }

    private TreeNode helper(int[] preorder, int preorderStart, int preorderEnd, int[] inorder, int inorderStart, int inorderEnd) {
        if (preorderStart > preorderEnd || inorderStart > inorderEnd) {
            return null;
        }
        int rootVal = preorder[preorderStart];
        TreeNode root = new TreeNode(rootVal);
        int index = inorderStart;
        while (index <= inorderEnd && inorder[index] != rootVal) {
            index++;
        }
        int leftSubtreeSize = index - inorderStart;
        int rightSubtreeSize = inorderEnd - index;
        root.left = helper(preorder, preorderStart + 1, preorderStart + leftSubtreeSize, inorder, inorderStart, index - 1);
        root.right = helper(preorder, preorderStart + leftSubtreeSize + 1, preorderEnd, inorder, index + 1, inorderEnd);
        return root;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • helper 函数对于每个节点都会被调用一次,其中 n 是树中节点的数量。
  • 在 helper 函数内部,对于每个节点,我们都会进行一次数组查找(index 循环),这需要 O(1) 的时间。
  • 因此,总的时间复杂度是 O(n)。
2. 空间复杂度
  • 空间复杂度主要取决于递归调用栈的深度,这通常与树的高度 h 有关。
  • 在最坏的情况下,树是完全不平衡的,例如每个节点都只有左子节点或者只有右子节点,此时树的高度等于节点的数量,空间复杂度为 O(n)。
  • 在最好的情况下,树是完全平衡的,此时树的高度为 log(n),空间复杂度为 O(log(n))。
  • 因此,空间复杂度在 O(log(n)) 到 O(n) 之间,取决于树的形状。

综上所述,代码的时间复杂度是 O(n),空间复杂度在 O(log(n)) 到 O(n) 之间,取决于树的形状。

五、总结知识点

  1. 递归:代码使用了递归的方法来构建二叉树。递归是一种分而治之的算法技巧,将复杂问题分解为更小的子问题,并逐个解决。

  2. 二叉树:代码操作的是二叉树数据结构,这是一种每个节点最多有两个子节点的树形结构。

  3. 先序遍历和中序遍历:先序遍历是指根节点、左子树、右子树的顺序,中序遍历是指左子树、根节点、右子树的顺序。这两个遍历顺序是构建二叉树的关键信息来源。

  4. 数组操作:代码中使用了数组操作来找到根节点在先序和中序遍历中的位置,并以此构建左右子树。

  5. 函数返回值buildTree 函数返回构建的二叉树的根节点,而 helper 函数返回当前节点的子节点。

  6. 节点定义:代码中使用了 TreeNode 类来定义二叉树的节点,每个节点包含一个整数值和指向左右子节点的引用。

  7. 递归的基本情况:递归函数通常有一个基本情况(base case),即递归退出的条件。在这个问题中,基本情况是当 preorderStart > preorderEnd 或 inorderStart > inorderEnd 时,表示没有更多的节点可以处理,此时返回 null

  8. 类型转换:在递归调用中,buildTree 函数的返回值被隐式转换为 TreeNode 类型。

  9. 递归调用栈:递归函数的调用会形成调用栈,用于存储每一层递归调用的局部变量和返回地址。

  10. 树的高度与深度:在二叉树中,根节点的深度为1,每个子节点的深度是其父节点深度加1。树的高度是从根节点到最远叶子节点的最长路径上的节点数。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

一图看懂 | 蓝卓医化行业解决方案

随着“创新药”首次出现在政府工作报告中&#xff0c;医药工业各个细分赛道都迎来了关键突破期&#xff0c;其中化学药品制剂作为所有药品中数量、品种最多的类别&#xff0c;也是居民日常生活中使用最广泛的类别&#xff0c;推动医药化工行业数字化能力&#xff0c;对于发展新…

解决docker中container运行闪退终止的问题

在运行bindmount-test时&#xff0c;点击完运行按钮后闪退结束运行。 第一步查看log日志&#xff1a; 2024-05-18 23:46:18 Error: Cannot find module /app/nodemon 2024-05-18 23:46:18 at Function.Module._resolveFilename (internal/modules/cjs/loader.js:668:15) …

pip如何快速install packet

1、在后面加-i https://mirrors.aliyun.com//pypi//simple或https://pypi.tuna.tsinghua.edu.cn/simple pip install numpy -i https://mirrors.aliyun.com//pypi//simplepip install numpy1.21.0 -i https://pypi.tuna.tsinghua.edu.cn/simple2、需要注意的是&#xff0c;如果…

k8s 声明式资源管理

一、资源配置清单的管理 1.1 查看资源配置清单 声明式管理方法&#xff1a; 1.适合于对资源的修改操作 2.声明式资源管理方法依赖于资源配置清单文件对资源进行管理 资源配置清单文件有两种格式&#xff1a;yaml&#xff08;人性化&#xff0c;易读&#xff09;&#xff0c;j…

实例展示vue单元测试及难题解惑

通过生动详实的例子带你排遍vue单元测试过程中的所有疑惑与难题。 技术栈&#xff1a;jest、vue-test-utils。 共四个部分&#xff1a;运行时、Mock、Stub、Configuring和CLI。 运行时 在跑测试用例时&#xff0c;大家的第一个绊脚石肯定是各种undifned报错。 解决这些报错…

精品干货-阿里巴巴华为等知名大厂数据中台最佳实践方案合集(52份可下载)

【1】关注本公众号 【1】私信发送 数据中台52 获取下载链接。 如需下载本方案PPT/WORD原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&#xff01;&#xff01;&#xff01;感谢支持&#xff01;&#xff01;&#xff01;

[STM32-HAL库]0.96寸OLED显示屏-模拟IIC-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C8T6

目录 一、前言 二、详细步骤 1.配置STM32CUBEMX 2.导入OLED库 3.程序设计 3.1 初始化OLED显示屏 3.2 显示字符串 3.3 显示汉字 三、汉字取模 四、总结 一、前言 OLED显示屏是一种十分常见的显示模块&#xff0c;通过用它作为采集到的传感器数据的展示模块。本文通过STM32CU…

每日一题——Python实现PAT甲级1028 List Sorting(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 ​编辑​编辑​编辑我的写法&#xff1a; 代码点评 代码点评&#xff1a; 时间复杂…

EasyExcel的CellWriteHandler注入CellStyle不生效

文章目录 一、问题描述二、问题排查三、解决问题 一、问题描述 最近发现原本项目的导出excel功能中&#xff0c;写的那些 CellWriteHandler 去改变样式的代码全都不生效了 二、问题排查 由于代码都是没有改动的&#xff0c;加上最近有升级过 easyExcel 的版本&#xff0c;由…

js实现鼠标拖拽多选功能

实现功能 在PC端的H5页面中&#xff0c;客户拖动鼠标可以连选多个选项 效果展示 具体代码如下 <!DOCTYPE html> <html><head><title>鼠标拖拽多选功能</title><script src"https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js&quo…

ArcGIS基础操作-ArcGIS插值交叉验证方法与流程

ArcGIS基础操作-ArcGIS插值交叉验证方法与流程 交叉验证(Cross-validation)主要用于建模应用中&#xff0c;例如PCR、PLS回归建模中。在给定的建模样本中&#xff0c;拿出大部分样本进行建模型&#xff0c;留小部分样本用刚建立的模型进行预报&#xff0c;并求这小部分样本的预…

自己手写一个字符串【C风格】

//字符串的常见操作 #include <iostream>#define MAX_SIZE 15 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status;//状态类型 typedef char ElemType;//元素类型typedef ElemType String[MAX_SIZE 1];//第一个字节记录长度//***tring是数…

华为设备WLAN配置之AP上线

WLAN基础配置之AP上线 配置WLAN无线网络的第一阶段&#xff0c;AP上线技术&#xff1a; 实验目标&#xff1a;使得AP能够获得来自AC的DHCP地址服务的地址&#xff0c;且是该网段地址池中的IP。 实验步骤&#xff1a; 1.把AC当作三层交换机配置虚拟网关 sys Enter system view,…

2024年艺术鉴赏与文化传播国际会议(AACC 2024)

2024年艺术鉴赏与文化传播国际会议&#xff08;AACC 2024&#xff09; 2024 International Conference on Art Appreciation and Cultural Communication 【重要信息】 大会地点&#xff1a;贵阳 大会官网&#xff1a;http://www.icaacc.com 投稿邮箱&#xff1a;icaaccsub-co…

webpack5零基础入门-16封装cssloader函数

1.背景 我们发现配的cssloader中有很多重复性代码&#xff0c;所以应该对其进行封装&#xff0c;减少冗余的代码 2.定义函数getCssLoader function getCssLoader(pre) {return [MiniCssExtractPlugin.loader, css-loader,{loader: postcss-loader,options: {postcssOptions:…

【笔记】树(Tree)

一、树的基本概念 1、树的简介 之前我们都是在谈论一对一的线性数据结构&#xff0c;可现实中也有很多一对多的情况需要处理&#xff0c;所以我们就需要一种能实现一对多的数据结构--“树”。 2、树的定义 树&#xff08;Tree&#xff09;是一种非线性的数据结构&#xff0…

Excel/WPS《超级处理器》同类项处理,合并同类项与拆分同类项目

在工作中处理表格数据&#xff0c;经常会遇到同类项处理的问题&#xff0c;合并同类项或者拆分同类项&#xff0c;接下来介绍使用超级处理器工具如何完成。 合并同类项 将同一列中的相同内容合并为一个单元格。 1&#xff09;用分隔符号隔开 将AB列表格&#xff0c;合并后为…

UML中的图-13中UML图详解

图是一组元素的图形表示&#xff0c;大多数情况下把图画成顶点和弧的联通图。 UML提供了13种图&#xff0c;分别是类图、对象图、用例图、序列图、通信图、状态图、活动图、构建图、组合结构图、部署图、包图、交互概览图和计时图。序列图、通信图、交互概览图和计时图均被称为…

vue3的核心API功能:computed()API使用

常规使用方法: 这样是常规使用方法. 另一种使用方法: 这样分别定义computed的get回调函数和set回调函数, 上面例子定义了plusOne.value的值为1, 那么这时候就走了computed的set回调函数,而没有走get回调函数. 当我们打印plusOne.value的值的时候,走的是get的回调函数而不是…

ubuntu20.04 10分钟搭建无延迟大疆无人机多线程流媒体服务器

1.使用效果 无人机画面 2.服务器视频端口 3.使用教程 3.1.下载ubuntu对应软件包&#xff1a;系统要求ubuntu16以上 3.2修改端口&#xff08;config.xml文件&#xff09; 3.3启动服务 目录下输入&#xff1a;终端启动&#xff1a;./smart_rtmpd 后台启动&#xff1a;nohup ./…