当前位置: 首页 > news >正文

LeetCode题练习与总结:二叉树的中序遍历--94

一、题目描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

二、递归方法

(一)解题思路

  1. 如果当前节点为空,返回。
  2. 递归遍历左子树。
  3. 访问当前节点,将节点的值添加到结果列表中。
  4. 递归遍历右子树。

(二)具体代码

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();inorder(root, result);return result;}private void inorder(TreeNode node, List<Integer> result) {if (node == null) {return;}inorder(node.left, result);result.add(node.val);inorder(node.right, result);}
}

(三)时间复杂度和空间复杂度

1. 时间复杂度
  • 递归方法会访问树中的每个节点恰好一次,因此时间复杂度与树中节点的数量成正比。
  • 在这个算法中,每个节点都会被访问一次,所以时间复杂度是 O(n),其中 n 是二叉树中的节点数。
2. 空间复杂度
  • 递归方法的空间复杂度主要取决于递归栈的深度,这通常与树的高度成正比。
  • 在最坏的情况下,树完全不平衡,每个节点都只有左子节点或者只有右子节点,递归栈的深度会达到节点数 n,因此空间复杂度为 O(n)。
  • 在最好的情况下,树是完全平衡的,递归栈的深度是 log(n),因此空间复杂度为 O(log(n))。
  • 综合考虑,空间复杂度在最坏情况下是 O(n),在最好情况下是 O(log(n)),平均情况下则介于两者之间。

综上所述,递归方法的中序遍历代码的时间复杂度是 O(n),空间复杂度在最坏情况下是 O(n),在最好情况下是 O(log(n))。

(四)总结知识点

1. 递归(Recursion):

  • 代码中使用了递归函数 inorder 来遍历二叉树的左子树、根节点和右子树。
  • 递归是一种常用的算法设计技巧,它通过函数自身调用自己来进行循环。

2. 二叉树(Binary Tree):

  • 代码操作的数据结构是二叉树,每个节点包含一个值和指向左右子节点的引用。
  • 二叉树是一种基础的数据结构,常用于各种算法问题。

3. 二叉树的中序遍历(Inorder Traversal of a Binary Tree):

  • 中序遍历是一种遍历二叉树的方法,按照“左-根-右”的顺序访问每个节点。
  • 这是二叉树遍历的三种基本方法之一(其他两种是前序遍历和后序遍历)。

4. Java 集合框架(Java Collections Framework):

  • 代码使用了 ArrayList 来存储遍历的结果,这是 Java 集合框架中的一个类。
  • ArrayList 是一个可调整大小的数组实现,提供了对元素的快速随机访问。

5. 函数定义和调用(Function Definition and Invocation):

  • 代码定义了两个函数:inorderTraversal 和 inorder
  • inorderTraversal 是公共方法,供外部调用;inorder 是私有辅助方法,用于递归遍历。

6. 基本语法(Basic Syntax):

  • 代码使用了基本的 Java 语法,如类定义、方法定义、条件语句(if)、返回语句(return)等。

7. 递归栈(Recursive Stack):

  • 虽然代码中没有显式使用栈数据结构,但递归函数在调用时会使用调用栈来存储每一层递归的状态。

三、迭代方法

(一)解题思路

  1. 初始化一个空栈和一个空列表。
  2. 将根节点及其所有左子节点入栈。
  3. 弹出栈顶元素,将其值添加到结果列表中。
  4. 将弹出节点的右子节点及其所有左子节点入栈。
  5. 重复步骤3和4,直到栈为空。

(二)具体代码

import java.util.Stack;class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode current = root;while (current != null || !stack.isEmpty()) {while (current != null) {stack.push(current);current = current.left;}current = stack.pop();result.add(current.val);current = current.right;}return result;}
}

(三)时间复杂度和空间复杂度

1. 时间复杂度
  • 中序遍历需要访问二叉树中的每个节点一次,因此时间复杂度与二叉树中节点的数量成正比。
  • 在这个算法中,每个节点都会被访问一次,所以时间复杂度是 O(n),其中 n 是二叉树中的节点数。
2. 空间复杂度
  • 空间复杂度主要取决于迭代过程中使用的栈的大小。
  • 在最坏的情况下,树完全不平衡,每个节点都只有左子节点或者只有右子节点,栈的大小会达到节点数 n,因此空间复杂度为 O(n)。
  • 在最好的情况下,树是完全平衡的,栈的大小是 log(n),因此空间复杂度为 O(log(n))。
  • 综合考虑,空间复杂度在最坏情况下是 O(n),在最好情况下是 O(log(n)),平均情况下则介于两者之间。

综上所述,这段代码的时间复杂度是 O(n),空间复杂度在最坏情况下是 O(n),在最好情况下是 O(log(n))。

(四)总结知识点

1. 迭代(Iteration):

  • 代码使用了一个循环结构来迭代地遍历二叉树的节点,而不是使用递归。

2. 栈(Stack)数据结构:

  • 代码使用了一个 Stack 来存储访问过的节点,以便后续能够按照正确的顺序访问它们的右子节点。
  • 栈是一种后进先出(LIFO)的数据结构,非常适合用于这种需要回溯的场景。

3. 二叉树(Binary Tree):

  • 代码操作的数据结构是二叉树,每个节点包含一个值和指向左右子节点的引用。
  • 二叉树是一种基础的数据结构,常用于各种算法问题。

4. 二叉树的中序遍历(Inorder Traversal of a Binary Tree):

  • 中序遍历是一种遍历二叉树的方法,按照“左-根-右”的顺序访问每个节点。
  • 这是二叉树遍历的三种基本方法之一(其他两种是前序遍历和后序遍历)。

5. Java 集合框架(Java Collections Framework):

  • 代码使用了 ArrayList 来存储遍历的结果,这是 Java 集合框架中的一个类。
  • ArrayList 是一个可调整大小的数组实现,提供了对元素的快速随机访问。
  • 同时,代码使用了 Stack 类来实现栈数据结构。

6. 循环和条件语句(Loop and Conditional Statements):

  • 代码使用了 while 循环来迭代遍历树节点,并使用了 if 语句来检查当前节点是否为空。

7. 函数定义和调用(Function Definition and Invocation):

  • 代码定义了一个公共方法 inorderTraversal,供外部调用。

8. 基本语法(Basic Syntax):

  • 代码使用了基本的 Java 语法,如类定义、方法定义、循环结构、条件语句等。

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

相关文章:

LeetCode题练习与总结:二叉树的中序遍历--94

一、题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;roo…...

云计算十三课

centos安装 点击左上角文件 点击新建虚拟机 点击下一步 点击稍后安装操作系统&#xff0c;下一步 选择Linux&#xff08;l&#xff09;下一步 设置虚拟机名称 点击浏览选择安装位置 新建文件夹设置名称不能为中文&#xff0c;点击确定 点击下一步 设置磁盘大小点击下一步…...

[数据集][目标检测]电力场景安全帽检测数据集VOC+YOLO格式295张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;295 标注数量(xml文件个数)&#xff1a;295 标注数量(txt文件个数)&#xff1a;295 标注类别…...

AtCoder Beginner Contest 308 A题 New Scheme

A题&#xff1a;New Scheme 标签&#xff1a;模拟 题意&#xff1a;给定 8 8 8个数的序列&#xff0c;询问这些数是否满足以下条件&#xff1a; 在 100 100 100到 675 675 675之间且能被 25 25 25整除序列是单调非递减的 题解&#xff1a;按题意模拟判断就好了。 代码&#…...

C++编程与朱元墇的关系

学编程和英语没关系&#xff0c;我说这句话&#xff0c;没人会相信&#xff0c;也不会有人说我什么哗众取宠。 我说学编程和朱元墇有关系&#xff0c;一定有人说我放P&#xff0c;其实这个P也和朱元墇有关系&#xff0c; 和朱元墇有什么P关系啊。 真有这P事啊&#xff0c; 朱元…...

0060__设计模式

1. 简单工厂模式( Simple Factory Pattern ) — Graphic Design Patterns 工厂模式 | 菜鸟教程 【设计模式——学习笔记】23种设计模式——建造者模式Builder&#xff08;原理讲解应用场景介绍案例介绍Java代码实现&#xff09;-CSDN博客 设计模式—— 五&#xff1a;迪米特…...

【Linux 网络】网络编程套接字 -- 详解

⚪ 预备知识 1、理解源 IP 地址和目的 IP 地址 举例理解&#xff1a;&#xff08;唐僧西天取经&#xff09; 在 IP 数据包头部中 有两个 IP 地址&#xff0c; 分别叫做源 IP 地址 和目的 IP 地址。 如果我们的台式机或者笔记本没有 IP 地址就无法上网&#xff0c;而因为…...

编译OpenResty遇到找不到OpenSSL的解决办法

以OpenResty-1.19.9.1为例 编辑openresty-1.19.9.1/build/nginx-1.19.9/auto/lib/openssl/conf CORE_INCS"$CORE_INCS $OPENSSL/.openssl/include" CORE_DEPS"$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h" CORE_LIBS"$CORE_LIBS $OPENSSL/.…...

Amazon Bedrock 托管 Llama 3 8B70B

Amazon Bedrock 托管 Llama 3 8B&70B&#xff0c;先来体验&#xff1a;&#xff08;*实验环境账号有效期为1天&#xff0c;到期自动关停&#xff0c;请注意重要数据保护&#xff09; https://dev.amazoncloud.cn/experience/cloudlab?id65fd86c7ca2a0d291be26068&visi…...

海豚调度器早期版本如何新增worker分组

在DolphinScheduler 1.3.5版本中&#xff0c;Worker分组通常是在部署时通过配置文件进行定义的&#xff0c;而不是在用户界面上直接操作。以下是在DolphinScheduler中新增Worker分组的一般步骤&#xff1a; 修改配置文件&#xff1a; DolphinScheduler的Worker分组信息通常在/…...

Debian Linux 下给Nginx 1.26.0 编译增加Brotli算法支持

明月发现参考【给Nginx添加谷歌Brotli压缩算法支持】一文给出的方法&#xff0c;在Debian Linux 12.5下就一直编译失败&#xff0c;主要的错误是因为文件缺失&#xff0c;在专门又安装了apt-get install libbrotli-dev的依赖库后依然会因为文件缺失无法编译完成&#xff0c;就这…...

中国银行从业在线教育系统,如何搭建网课平台?

如今这个时代相信没多少人是没听过网课平台的&#xff0c;绝大多数人对网课平台的名气是如雷贯耳的。时代的发展&#xff0c;让人们学习的方式变得更加的方便与快捷。今天就来和大家说说网课平台搭建都有哪些方法?网课平台难搭建么? 网课平台搭建的方法&#xff0c;其实网课平…...

解决java.lang.IllegalArgumentException异常的正确方法

java.lang.IllegalArgumentException 是 Java 中的一个异常类&#xff0c;表示方法中传递的参数不合法。这个异常通常在方法被调用时抛出&#xff0c;表明方法的参数出现了问题。要正确解决这个异常&#xff0c;你可以按照以下步骤进行&#xff1a; 查看异常信息&#xff1a;首…...

齿轮滚刀刃口钝化技术简介

介绍 在滚刀的使用中发现&#xff0c;进口滚刀和国产滚刀在加工质量和寿命方面存在显著差异。经过多次比较得知&#xff0c;滚刀的使用寿命可以达到国产滚刀的两倍以上&#xff0c;而进口滚刀返回原厂磨削后的使用寿命约为新刀具的90% &#xff0c;但同样经过国内厂家磨削后&a…...

【ESP32接入ATK-MO1218 GPS模块】

【ESP32接入ATK-MO1218 GPS模块】 1. 引言2. ATK-MO1218 GPS模块概述3. 接入ATK-MO1218 GPS模块的步骤4. 示例代码5. 结论1. 引言 在现代的嵌入式系统和物联网项目中,精确的位置信息是至关重要的。ATK-MO1218 GPS模块作为一款高性能的GPS/北斗双模定位模块,为开发者提供了强…...

EDA设计学习笔记2:STM32F103C8T6最小系统板的仿绘

今日开始仿制练习一个STM32F103C8T6最小系统板&#xff0c;通过对这个最小系统板的仿制&#xff0c;达到对自己PCB设计的练习的目的&#xff0c;最终目标是自己设计出一块PCB&#xff0c;做一个OLED的桌面小摆件...... 也不知道画出来能不能用..... 目录 主控芯片的搜索与放置…...

实现树莓派DS18B20读取温度(OneWire)

简介 使用的是树莓派3B, Go编程实现OneWire方式读取DS18B20温度。 接线 DS18B20 包含经典三线&#xff0c; VCC和GND自不必说&#xff0c; 主要的是DQ线&#xff0c; 需要接4.7K的上拉电阻&#xff0c; 即4.7K欧姆的电阻接到DQ和VCC&#xff0c; 否则树莓派识别不到DS18B20&am…...

Android 蓝牙实战——蓝牙音乐播放/暂停状态(二十二)

对于蓝牙音乐的播放状态,我们首先主要处理的是 onPlayStatusChanged() 回调,这是协议栈通知 FW 层的一个回调接口。还有一个就是 getPlayBackState() 方法,这是媒体应用在初始化时未收到回调信息主动获取当前状态的方法。我们这里就来分析一下这两个状态的获取流程。 一、状…...

linux学习:视频输入+V4L2

目录 V4L2 视频采集流程 代码例子 核心命令字和结构体 VIDIOC_ENUM_FMT VIDIOC_G_FMT / VIDIOC_S_FMT / VIDIOC_TRY_FM VIDIOC_REQBUFS VIDIOC_QUERYBUF VIDIOC_QBUF /VIDIOC_DQBUF VIDIOC_STREAMON / VIDIOC_STREAMOFF V4L2 是 Linux 处理视频的最新标准代码模块&…...

[AutoSar]BSW_Diagnostic_004 ReadDataByIdentifier(0x22)的配置和实现

目录 关键词平台说明背景一、配置DcmDspDataInfos二、配置DcmDspDatas三、创建DcmDspDidInfos四、创建DcmDspDids五、总览六、创建一个ASWC七、mapping DCM port八、打开davinci developer&#xff0c;创建runnabl九、生成代码 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、…...

3个核心优势让研究者实现智能OCR全场景覆盖:Pix2Text开源替代方案详解

3个核心优势让研究者实现智能OCR全场景覆盖&#xff1a;Pix2Text开源替代方案详解 【免费下载链接】Pix2Text Pix In, Latex & Text Out. Recognize Chinese, English Texts, and Math Formulas from Images. 项目地址: https://gitcode.com/gh_mirrors/pi/Pix2Text …...

PyTorch 2.8镜像实际效果:torch.compile+FlashAttention-2双优化下的吞吐量提升对比

PyTorch 2.8镜像实际效果&#xff1a;torch.compileFlashAttention-2双优化下的吞吐量提升对比 1. 镜像环境与技术亮点 PyTorch 2.8深度学习镜像为开发者提供了一个开箱即用的高性能计算环境。基于RTX 4090D 24GB显卡和CUDA 12.4的深度优化组合&#xff0c;这个镜像特别适合需…...

神州数码无线网络(AC+AP)实战部署与优化指南

1. 神州数码ACAP无线网络部署前的规划准备 第一次接触神州数码无线网络方案时&#xff0c;我被它简洁的架构设计惊艳到了。AC&#xff08;无线控制器&#xff09;AP&#xff08;接入点&#xff09;的组网模式&#xff0c;特别适合500-2000平米的中型企业办公环境。但在真正动手…...

教育博主私藏!PPT生成网站实用指南

作为一名教育博主&#xff0c;我深刻体会到制作 PPT 是教育工作者日常工作中不可或缺的一部分。借助合适的工具&#xff0c;能有效降低 PPT 制作门槛&#xff0c;提升演示内容的专业度和吸引力。今天&#xff0c;就给大家分享几款亲测好用的 PPT 生成网站&#xff0c;助力大家高…...

从智能门铃到工业质检:拆解5个嵌入式AI落地案例,看模型压缩和硬件选型怎么选

从智能门铃到工业质检&#xff1a;5个嵌入式AI实战案例与选型策略 智能门铃的摄像头突然捕捉到一张陌生面孔&#xff0c;300毫秒内完成本地人脸比对并推送到主人手机——这背后是嵌入式AI在消费电子领域的典型应用。当算法工程师面对瑞芯微RK3588和地平线旭日X3两颗芯片的选型表…...

MIKE URBAN中污水处理厂如何进行概化

01 前言应用厂网一体化耦合模型研究水厂间调度和厂前溢流入河污染量等内容时&#xff0c;由于不需要关注污水处理厂内部的具体处理工艺&#xff0c;需要对污水处理厂的关键设施进行概化处理。02 水厂资料收集收集污水处理的工艺流程图和设施设计参数。依据厂网一体化模型的研究…...

有线/无线(空口)抓包过程及其分析

一、如何判断该抓有线包&#xff0c;还是无线包层级问题类型抓包位置L1/L2&#xff08;无线&#xff09;连不上、掉线、弱信号无线抓包L2&#xff08;有线&#xff09;VLAN错误有线抓包L3&#xff08;IP&#xff09;DHCP失败有线抓包L4&#xff08;传输&#xff09;丢包、重传有…...

在Ubuntu 22.04上搞定Gen6D位姿估计:从CUDA 11.8到Pytorch3D 0.7.8的完整环境搭建避坑指南

在Ubuntu 22.04上构建Gen6D位姿估计开发环境的全流程解析 计算机视觉领域的位姿估计技术正在重塑增强现实与机器人导航的边界。Gen6D作为香港大学团队开源的前沿项目&#xff0c;其无需CAD模型的特性为物体位姿识别提供了新思路。本文将彻底拆解Ubuntu 22.04环境下从驱动层到算…...

当nodepad遇见AI:利用快马平台快速集成智能代码补全与文本润色功能

最近在折腾一个智能文本编辑器项目&#xff0c;想把AI能力集成到传统的文本编辑场景中。经过一番摸索&#xff0c;发现用InsCode(快马)平台可以快速实现这个想法&#xff0c;整个过程比想象中简单很多。这里记录下我的实践过程&#xff0c;分享给同样对AI辅助开发感兴趣的朋友。…...

Linux调试信息双输出:script与tee工具详解

1. Linux调试信息双输出方案概述在Linux系统开发过程中&#xff0c;调试信息的输出管理是每个开发者都会遇到的常规需求。默认情况下&#xff0c;使用printf等函数输出的调试信息会直接显示在终端&#xff08;标准输出stdout&#xff09;上。但在实际开发场景中&#xff0c;我们…...