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

二、方法一:递归方法

(一)解题思路

递归方法是最直观的,按照前序遍历的顺序,递归地访问每个节点:

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

(二)具体代码

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)(递归栈空间)

(四)总结知识点

  1. 递归:这是一种编程技巧,允许函数调用自身。在这个代码中,preorder函数会递归地调用自身来遍历二叉树的每个节点。

  2. 二叉树遍历:代码实现了二叉树的前序遍历,这是一种深度优先遍历策略,按照“根-左-右”的顺序访问树的节点。

  3. 二叉树节点定义:代码中使用了TreeNode类来定义二叉树的节点,每个节点包含一个整数值val和两个指向其左右子节点的指针leftright

  4. Java集合框架:代码使用了ArrayList来存储遍历的结果。ArrayList是Java集合框架中的一个可调整大小的数组实现,用于存储对象列表。

  5. 函数参数传递:代码中的preorder函数接受一个TreeNode类型的参数和一个List<Integer>类型的参数,这展示了如何在Java中传递和修改对象引用。

  6. 基本语法结构:代码包含了基本的Java语法结构,如类的定义、方法的定义、条件语句(if)、返回语句(return)和列表的添加操作(result.add)。

  7. 递归的基本条件:在preorder函数中,递归的基本条件是当遇到一个null节点时返回,这避免了递归调用的无限循环。

  8. 方法重载Solution类中有两个名为preorder的方法,但它们的参数列表不同,这是Java方法重载的例子。一个方法是公共的,用于外部调用,另一个方法是私有的,作为辅助方法用于递归遍历。

三、方法二:迭代方法

(一)解题思路

迭代方法通常使用栈来模拟递归过程:

  1. 创建一个空栈,将根节点压入栈中。
  2. 当栈不为空时,弹出栈顶元素,访问该节点,并将其值添加到结果列表中。
  3. 先将弹出节点的右子节点(如果有)压入栈中,然后将左子节点(如果有)压入栈中。这样可以保证左子节点先被访问。
  4. 重复步骤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)

(四)总结知识点

  1. 迭代方法:与递归方法不同,迭代方法使用栈来模拟递归过程,用于遍历二叉树的节点。

  2. 栈数据结构:代码使用了Stack类来存储待访问的节点。栈是一种后进先出(LIFO)的数据结构,用于在迭代过程中保持节点的访问顺序。

  3. 二叉树遍历:代码实现了二叉树的前序遍历,按照“根-左-右”的顺序访问树的节点。

  4. 二叉树节点定义:代码中使用了TreeNode类来定义二叉树的节点,每个节点包含一个整数值val和两个指向其左右子节点的指针leftright

  5. Java集合框架:代码使用了ArrayList来存储遍历的结果。ArrayList是Java集合框架中的一个可调整大小的数组实现,用于存储对象列表。

  6. 条件语句:代码中的if语句用于检查当前节点是否有左右子节点,以便将它们添加到栈中。

  7. 循环结构while循环用于在栈不为空的情况下继续遍历二叉树的节点。

  8. 基本语法结构:代码包含了基本的Java语法结构,如类的定义、方法的定义、栈的操作(pushpop)以及列表的添加操作(result.add)。

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

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

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

相关文章

数据资产的创新应用与未来展望:探讨数据资产在人工智能、物联网等新兴领域的应用前景,提出前瞻性的数据资产解决方案,为企业探索新的增长点,推动行业创新发展

目录 一、引言 二、数据资产在人工智能领域的应用 1、机器学习与深度学习 2、自然语言处理 3、计算机视觉 三、数据资产在物联网领域的应用 1、智能家居 2、工业物联网 3、智慧城市 四、前瞻性的数据资产解决方案 1、构建统一的数据管理平台 2、加强数据安全和隐私…

webpack源码解析---addEntry

addEntry EntryPlugin的注册 webpack会从入口开始解析依赖。 WebpackOptionsApply new WebpackOptionsApply().process(compiler, options); class WebpackOptionsApply {constructor () {}process () {// 注册 EntryOptionPlugin new EntryOptionPlugin().apply(compiler);}…

基于路径长度的样条插补算法(自动驾驶和路径跟踪控制适用)

以前在做车辆跟踪控制的时候发现在针对有多个X和多个Y对应的路径插补时候&#xff0c;总是报错&#xff0c;因为MATLAB里面的interp1插补函数它要求x要唯一对应一个y&#xff0c;当路径以单独的x或者y来求插补时候的时候就报错。由于在使用Matlab的interp1函数进行插值时&#…

怎样才能更好地保护个人账号的安全

怎样才能更好地保护个人账号的安全 保护个人账号安全是网络安全的重要组成部分&#xff0c;以下是一些有效的措施来增强账号的安全性&#xff1a; 1. 使用强密码 复杂性&#xff1a;创建包含大小写字母、数字和特殊字符的密码。长度&#xff1a;密码至少应有12个字符长。唯一…

谈谈检测浏览器类型

前几天被问到如何检测浏览器类型&#xff0c;我突然发现我对此并不了解&#xff0c;之前的项目中也没有使用到过&#xff0c;只隐约记得通过一个自带的方法即可获取。所以今天特意来仔细补习一下。 核心&#xff1a;navigator.userAgent 1.正则表达式 2.引用外部库 3.判断浏…

【Android面试八股文】你知道什么是冷启动和热启动吗?你知道应用冷启动的全流程吗?你知道如何解决启动时候的黑白屏问题?

文章目录 一、冷启动、热启动的概念二、冷启动的流程冷启动启动流程:流程细节三、如何解决启动时候的黑白屏问题?一、冷启动、热启动的概念 在Android开发中,冷启动和热启动是两个重要的概念,它们描述了应用程序启动时不同的状态和表现: 冷启动(Cold Start): 冷启动指…

记一次kafka使用不当导致的服务器异常

一、背景 1.运维反馈服务器cpu高&#xff0c;且高达80% 2.经过排查发现kafka出现消息积压情况 3.使用的是springboot kafka框架 dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency…

Linux-网络安全私房菜

文章目录 前言入门基本指令篇章字符集设置cdlsdatemkdirtouch-d-m 修改主机名rmshredrename重命名mv移动tar打包与压缩打包但是不压缩打包且压缩更新包文件解压对应的包 zip压缩文件命令cat查看显示行号交互写入&#xff08;追加&#xff09;显示空行 more和lesshead和tailhead…

Android的悬浮时钟(一)

在Android&#xff0c;如果要悬浮在其他应用上方显示时钟或者其他界面的话是需要申请权限的。 首先在manifest中我们就要写自己要申请的权限SYSTEM_ALERT_WINDOW <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" /> 不同于请求照片或…

期末复习---程序填空

注意&#xff1a; 1.数组后移 *p *(p-1) //把前一个数赋值到后一个数的位置上来覆盖后一个数 2.指针找最大字符 max *p while( *p){ if( max< *p) { max*p; qp;/ 用新的指针指向这个已经找到的最大位置&#xff1b;!!!!!!!!! } p; //因为开始没有next &#xff…

Web工程化

1、webpack 1.1 概念 一个前端打包器。 webpack 只识别javascript. 所以需要安装nodejs环境。 1.2 运行环境 Nodejs Nodejs 是运行JavaScript的环境。 因为nodejs发布了许多版本&#xff0c;在不同的技术栈下&#xff0c;需要使用不同的nodejs。 所以需要在电脑上安装n…

web应用技术-第十一次课后作业

验证过滤器进行权限验证的原理。 Filter过滤器&#xff1a;可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。一般完成登录校验、统一编码处理、敏感字符处理等通用操作。 定义&#xff1a;实现Filter接口 配置&#xff1a;WebFilter(urlPatterns"/*&qu…

常见VPS主机术语有哪些?VPS术语解析

常见VPS主机术语有哪些&#xff1f;本期为大家解析一下我们常见到的听到的VPS专业术语&#xff0c;帮助大家更轻松的了解VPS主机相关知识。 常见VPS主机术语 Apache – 世界上最流行的 Web 服务器软件。 CentOS – 旨在提供基于 Red Hat Enterprise Linux 的企业级操作系统的…

mysql 主主HA高可用方案详解

1.环境准备&#xff1a; 主机&#xff1a;1921.4,1921.5 操作系统&#xff1a;centos 7.3 mysql数据库版本&#xff1a;mysql 5.7.13 浮动IP:1921.182 2.mysql 下载及解压安装配置 2.1 下载&#xff1a; #wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.13-linu…

easyexcel 模板填充Excel数据,实现自定义换行及动态调整行高,并保持列表格式一致

pom依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version> </dependency><dependency><groupId>com.alibaba</groupId><artifa…

数据结构-线性表的应用

目录 前言一、有序表的合并1.1 顺序表实现1.2 单链表实现 二、稀疏多项式的相加和相乘2.1 稀疏多项式的相加2.2 稀疏多项式的相乘 总结 前言 本篇文章介绍线性表的应用&#xff0c;分别使用顺序表和单链表实现有序表的合并&#xff0c;最后介绍如何使用单链表实现两个稀疏多项…

基于springboot+vue+uniapp的超市售货管理平台

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

考研生活day2--王道课后习题2.3.1、2.3.2、2.3.3

2.3.1 题目描述&#xff1a; 这题和曾经做过的LeetCode203.移除元素一模一样&#xff0c;所以我们就使用LeetCode进行书写&#xff0c;题目链接203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 解题思路 大家的第一反应肯定是根据书上所学的书写方法一样书写&…

【PB案例学习笔记】-26制作一个带浮动图标的工具栏

写在前面 这是PB案例学习笔记系列文章的第26篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

爬虫cookie是什么意思

“爬虫 cookie”指的是网络爬虫在访问网站时所使用的cookie&#xff0c;网络爬虫是一种自动化程序&#xff0c;用于在互联网上收集信息并进行索引&#xff0c;这些信息可以用于搜索引擎、数据分析或其他目的。 本教程操作系统&#xff1a;Windows10系统、Dell G3电脑。 “爬虫…