LeetCode题练习与总结:二叉树的前序遍历--144
一、题目描述
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例 1:

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

输入:root = [1,2] 输出:[1,2]
示例 5:

输入:root = [1,null,2] 输出:[1,2]
提示:
- 树中节点数目在范围
[0, 100]内 -100 <= Node.val <= 100
二、方法一:递归方法
(一)解题思路
递归方法是最直观的,按照前序遍历的顺序,递归地访问每个节点:
- 如果当前节点为空,返回。
- 访问当前节点,将节点的值添加到结果列表中。
- 递归地前序遍历左子树。
- 递归地前序遍历右子树。
(二)具体代码
import java.util.ArrayList;
import java.util.List;public class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();preorder(root, result);return result;}private void preorder(TreeNode node, List<Integer> result) {if (node == null) {return;}result.add(node.val); // 访问根节点preorder(node.left, result); // 遍历左子树preorder(node.right, result); // 遍历右子树}
}
(三)时间复杂度和空间复杂度
1. 时间复杂度
- 原因:递归方法访问树中每个节点一次。
- 计算:对于具有
N个节点的二叉树,每个节点都恰好被访问一次。 - 结果:时间复杂度为
O(N),其中N是二叉树中节点的数量。
2. 空间复杂度
- 原因:递归方法使用栈空间来存储递归调用的信息,其大小取决于树的高度。
- 最坏情况:如果树完全不平衡,每个节点只有左子节点或只有右子节点,递归栈的深度将达到
N。 - 最好情况:如果树是完全平衡的,递归栈的深度将是
logN。 - 额外空间:代码中没有使用除了递归栈以外的额外空间。
- 结果:空间复杂度介于
O(logN)和O(N)之间,取决于树的形状。额外空间复杂度是O(1)。
3. 总结
- 时间复杂度:
O(N) - 空间复杂度:
O(1)(额外空间),O(logN)到O(N)(递归栈空间)
(四)总结知识点
-
递归:这是一种编程技巧,允许函数调用自身。在这个代码中,
preorder函数会递归地调用自身来遍历二叉树的每个节点。 -
二叉树遍历:代码实现了二叉树的前序遍历,这是一种深度优先遍历策略,按照“根-左-右”的顺序访问树的节点。
-
二叉树节点定义:代码中使用了
TreeNode类来定义二叉树的节点,每个节点包含一个整数值val和两个指向其左右子节点的指针left和right。 -
Java集合框架:代码使用了
ArrayList来存储遍历的结果。ArrayList是Java集合框架中的一个可调整大小的数组实现,用于存储对象列表。 -
函数参数传递:代码中的
preorder函数接受一个TreeNode类型的参数和一个List<Integer>类型的参数,这展示了如何在Java中传递和修改对象引用。 -
基本语法结构:代码包含了基本的Java语法结构,如类的定义、方法的定义、条件语句(
if)、返回语句(return)和列表的添加操作(result.add)。 -
递归的基本条件:在
preorder函数中,递归的基本条件是当遇到一个null节点时返回,这避免了递归调用的无限循环。 -
方法重载:
Solution类中有两个名为preorder的方法,但它们的参数列表不同,这是Java方法重载的例子。一个方法是公共的,用于外部调用,另一个方法是私有的,作为辅助方法用于递归遍历。
三、方法二:迭代方法
(一)解题思路
迭代方法通常使用栈来模拟递归过程:
- 创建一个空栈,将根节点压入栈中。
- 当栈不为空时,弹出栈顶元素,访问该节点,并将其值添加到结果列表中。
- 先将弹出节点的右子节点(如果有)压入栈中,然后将左子节点(如果有)压入栈中。这样可以保证左子节点先被访问。
- 重复步骤2和3,直到栈为空。
(二)具体代码
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;public class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();if (root != null) {stack.push(root);}while (!stack.isEmpty()) {TreeNode node = stack.pop();result.add(node.val); // 访问节点if (node.right != null) {stack.push(node.right); // 右子节点先入栈}if (node.left != null) {stack.push(node.left); // 左子节点后入栈}}return result;}
}
(三)时间复杂度和空间复杂度
1. 时间复杂度
- 原因:迭代方法访问树中每个节点一次。
- 计算:对于具有
N个节点的二叉树,每个节点都恰好被访问一次。 - 结果:时间复杂度为
O(N),其中N是二叉树中节点的数量。
2. 空间复杂度
- 原因:迭代方法使用栈空间来存储待访问的节点,其大小取决于树的高度。
- 最坏情况:如果树完全不平衡,每个节点只有左子节点或只有右子节点,栈的深度将达到
N。 - 最好情况:如果树是完全平衡的,栈的深度将是
logN。 - 结果:空间复杂度介于
O(logN)和O(N)之间,取决于树的形状。
3. 总结
- 时间复杂度:
O(N) - 空间复杂度:
O(logN)到O(N)
(四)总结知识点
-
迭代方法:与递归方法不同,迭代方法使用栈来模拟递归过程,用于遍历二叉树的节点。
-
栈数据结构:代码使用了
Stack类来存储待访问的节点。栈是一种后进先出(LIFO)的数据结构,用于在迭代过程中保持节点的访问顺序。 -
二叉树遍历:代码实现了二叉树的前序遍历,按照“根-左-右”的顺序访问树的节点。
-
二叉树节点定义:代码中使用了
TreeNode类来定义二叉树的节点,每个节点包含一个整数值val和两个指向其左右子节点的指针left和right。 -
Java集合框架:代码使用了
ArrayList来存储遍历的结果。ArrayList是Java集合框架中的一个可调整大小的数组实现,用于存储对象列表。 -
条件语句:代码中的
if语句用于检查当前节点是否有左右子节点,以便将它们添加到栈中。 -
循环结构:
while循环用于在栈不为空的情况下继续遍历二叉树的节点。 -
基本语法结构:代码包含了基本的Java语法结构,如类的定义、方法的定义、栈的操作(
push和pop)以及列表的添加操作(result.add)。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。
相关文章:
LeetCode题练习与总结:二叉树的前序遍历--144
一、题目描述 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[]示例 3: 输入:roo…...
如何优化Spring Boot应用的性能
如何优化Spring Boot应用的性能 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何通过优化技术和最佳实践来提升Spring Boot应用的性能&#x…...
人工智能--目标检测
欢迎来到 Papicatch的博客 文章目录 🍉引言 🍉概述 🍈目标检测的主要流程通常包括以下几个步骤 🍍数据采集 🍍数据预处理 🍍特征提取 🍍目标定位 🍍目标分类 🍈…...
Java基础之List实现类
文章目录 一、基本介绍二、常见方法三、ArrayList注意事项四、ArrayList底层结构我的理解 五、ArrayList扩容机制无参构造器有参构造器 六、LinkedList介绍底层操作机制 七、ArrayList 与 LinkedListArrayListLinkedList tip:以下是正文部分 一、基本介绍 List集合…...
java List接口介绍
List 是 Java 集合框架中的一个接口,它继承自 Collection 接口,代表一个有序的元素集合。List 允许重复的元素,并且可以通过索引来访问元素。Java 提供了多种 List 的实现,如 ArrayList、LinkedList、Vector 和 CopyOnWriteArrayList。 List接口概述 List 接口提供了一些…...
调度器APScheduler定时执行任务
APScheduler(Advanced Python Scheduler)是一个Python库,用于调度任务,使其在预定的时间间隔或特定时间点执行。它支持多种调度方式,包括定时(interval)、日期(date)和Cr…...
git合并分支的疑问
今天遇到一个奇怪的问题: 1、后端从master拉了三个分支。分别为dev、test、和stage。 2、研发1从dev拉了分支feature1,然后commit、commit、commit……。最后request merge到dev、test和stage。成功了。 3、研发2从dev拉了分支feature2,注意,feature2…...
catia数控加工仿真Productlist无法添加部件或零件
这种情况是没有把NCSetup显示 在工具中勾选即可...
关于Pycharm右下角不显示解释器interpreter的问题解决
关于Pycharm右下角不显示解释器interpreter的问题 在安装新的Pycharm后,发现右下角的 interpreter 的选型消失了: 觉得还挺不习惯的,于是网上找解决办法,无果。 自己摸索了一番后,发现解决办法如下: 勾…...
为什么word生成的PDF内容显示不全?
在现代办公环境中,将文档从一个格式转换为另一个格式是一个常见的任务。然而,有时候我们可能会遇到意想不到的问题,比如使用Word转换成PDF时,生成的PDF文件只显示了整个界面的四分之一内容。这种问题不仅令人困扰,也可…...
JVM专题十三:总结与整理(持续更新)
图解JVM JVM与Java体系结构 JVM垃圾回收算法 JVM垃圾回收器 图解JVM主要是放了前面12个章节的我们给大家画的图,做了整体的汇总,大家可以根据图区回忆我们所说的内容,查缺补漏。 实战经验 1、项目中数据量多少,QPS与TPS最高多少…...
MobPush iOS端海外推送最佳实现
推送注册 在AppDelegate里进行SDK初始化(也可以在Info.plist文件中进行AppKey,AppSecret的配置)并对通知功能进行注册以及设置推送的环境和切换海外服务器等,参考如下步骤代码: <span style"background-colo…...
商家团购app微信小程序模板
手机微信商家团购小程序页面,商家订餐外卖小程序前端模板下载。包含:团购主页、购物车订餐页面、我的订单、个人主页等。 商家团购app微信小程序模板...
探索AudioLM:音频生成技术的未来
目录 2. AudioLM的基础理论 2.1. 音频生成的基本概念 2.2. 语言模型在音频生成中的应用 2.3. 深度学习在音频生成中的作用 3. AudioLM的架构与实现 3.1. AudioLM的基本架构 3.1.1 编码器 3.1.2 解码器 3.1.3 生成模块 3.2. 训练过程 3.2.1 数据预处理 3.2.2 损失函…...
计算机视觉:深入了解图像分类、目标检测和图像分割的核心技术
计算机视觉是什么? 计算机视觉是一门致力于让计算机“看懂”图像和视频的技术,它旨在通过模拟人类视觉系统来理解和解释数字化视觉信息。这一领域涉及图像的获取、处理、分析和理解,最终用于从视觉数据中提取有用信息并做出决策。计算机视觉的…...
Django 安装 Zinnia 后出现故障
在Django中安装和配置Zinnia时遇到故障可能有多种原因,通常包括版本兼容性、依赖关系或配置问题。这里提供一些常见的解决方法和调试步骤,帮助大家解决问题。 首先,确保您安装的Zinnia版本与Django版本兼容。查看Zinnia的官方文档或GitHub页…...
.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作
一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 (1)判断bucket是否存在 (2)新建bucket (…...
Three.js机器人与星系动态场景:实现3D渲染与交互式控制
内容摘要:使用Three.js库构建了一个交互式的3D场景。组件中创建了一个机器人模型,包括头部、眼睛、触角、身体和四肢,以及两个相同的机器人实例以实现动态效果。场景中还加入了粒子效果,模拟星系环境,增强了视觉效果。…...
Android系统集成和使用FFmpeg
文章目录 前言FFmpeg源码下载交叉编译NDK下载x264编译源码下载编译 FFmpeg编译脚本 AOSP继承FFmpeg 前言 原生AOSP中并未继承FFmpeg,所以要想在android上使用,需要自己编译集成。 FFmpeg源码下载 git clone https://git.ffmpeg.org/ffmpeg.git目前最新…...
水果商城外卖微信小程序模板
手机微信水果外卖,水果电商,水果商城网页小程序模板。包含:主页、列表页、详情页、购物车、个人中心。 水果商城外卖小程序模板...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
Yolo11改进策略:Block改进|FCM,特征互补映射模块|AAAI 2025|即插即用
1 论文信息 FBRT-YOLO(Faster and Better for Real-Time Aerial Image Detection)是由北京理工大学团队提出的专用于航拍图像实时目标检测的创新框架,发表于AAAI 2025。论文针对航拍场景中小目标检测的核心难题展开研究,重点解决…...
npm install 相关命令
npm install 相关命令 基本安装命令 # 安装 package.json 中列出的所有依赖 npm install npm i # 简写形式# 安装特定包 npm install <package-name># 安装特定版本 npm install <package-name><version>依赖类型选项 # 安装为生产依赖(默认&…...
LeetCode第244题_最短单词距离II
LeetCode第244题:最短单词距离II 问题描述 设计一个类,接收一个单词数组 wordsDict,并实现一个方法,该方法能够计算两个不同单词在该数组中出现位置的最短距离。 你需要实现一个 WordDistance 类: WordDistance(String[] word…...
