【力扣题解】P144-二叉树的前序遍历-Java题解

花无缺

👨‍💻博客主页:@花无缺
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 花无缺 原创

收录于专栏 【力扣题解】


文章目录

  • 【力扣题解】P144-二叉树的前序遍历-Java题解
    • 🌏题目描述
    • 💡题解
    • 🌏总结


【力扣题解】P144-二叉树的前序遍历-Java题解

144. 二叉树的前序遍历

🌏题目描述

示例 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

💡题解

递归法:

public List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    preorder(root, res);
    return res;
}

public void preorder(TreeNode root, List<Integer> res) {
    // 如果根节点为空, 终止遍历
    if (root == null) {
        return;
    }
    // 遍历根节点
    res.add(root.val);
    // 先序遍历左子树
    preorder(root.left, res);
    // 先序遍历右子树
    preorder(root.right, res);
}

时间复杂度:时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。

迭代法:

public List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    // 根节点为空, 返回空列表
    if (root == null) return res;
    // 使用一个栈模拟二叉树的递归遍历
    Deque<TreeNode> stack = new LinkedList<>();
    // 根节点先进栈
    stack.offerLast(root);
    // 迭代遍历左子树和右子树
    while (!stack.isEmpty()) {
        // 遍历根节点, 并出栈
        TreeNode node = stack.pollLast();
        res.add(node.val);
        // 根节点出栈后, 右子树先进栈
        if (node.right != null) {
            stack.offerLast(node.right);
        }
        // 右子树进栈后, 左子树再进栈, 节点的进栈顺序为: 中->右->左
        // 出栈的顺序就是前序遍历的顺序: 中->左->右
        if (node.left != null) {
            stack.offerLast(node.left);
        }
    }
    return res;
}

时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。

🌏总结

首先我们先来了解什么是二叉树的前序遍历:二叉树的前序遍历就是按照:根节点->左子树->右子树的顺序遍历这棵二叉树。对于二叉树的操作,我们首先就会想到递归的方法。

而对于迭代法,其实也是递归思想,递归法隐式地维护了一个栈,而迭代法就是显式的维护一个栈达到模拟递归的效果。在迭代法中,我们先将根节点入栈,遍历根节点,然后将根节点出栈,根节点出栈后,将它的左右节点分别入栈,但是注意这里左右节点入栈的顺序是有严格要求的,要先将当前节点的右孩子节点先入栈,然后再将左孩子节点入栈,也即进栈顺序:根节点->右子树->左子树这样在节点出栈时就会是前序遍历的顺序:根节点->左子树->右子树

作者:花无缺(huawuque404.com)


🌸欢迎关注我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~
🍻一起进步-刷题专栏:【力扣题解】
🥇往期精彩好文:
📢【CSS选择器全解指南】
📢【HTML万字详解】
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容的最大动力!
谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EEPROM

芯片地址 前四位固定为1010&#xff0c;A2~A0为由管脚电平。AT24CXX EEPROM Board模块中默认为接地。A2~A0为000&#xff0c;最后一位表示读写操作。所以AT24Cxx的读地址为0xA1,写地址为0xA0。 写24C02的时候&#xff0c;从器件地址为10100000&#xff08;0xA0&#xff09;&am…

C单片机数据类型

C语言数据类型 关键字位数表示范围stdint关键字ST关键字unsigned char80 ~ 255uint8_tu8char8-128 ~ 127int8_ts8unsigned short160 ~ 65535uint16_tu16short16-32768 ~ 32767int16_ts16unsigned int320 ~ 4294967295uint32_tu32int32-2147483648 ~ 2147483647int32_ts32unsig…

Linux的安装及管理程序

一、如何在linux安装卸载软件 1. 编译安装 灵活性较高 难度较大 可以安装较新的版本 2. rpm安装&#xff08;redhat&#xff09; linux 包安装 查软件信息&#xff1a;是否安装&#xff0c;文件列表 rpm 软件名 3. yum yum是RPM升级版本&#xff0c;解决rpm的弊端 安装软件 首…

引用jquery.js的html5基础页面模板

本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

MR实战:学生信息排序

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建学生实体类5、创建学生映射器类5、创建…

OPNET Modeler帮助文档的打开方式

前面有篇文章修改OPNET帮助文档的默认打开浏览器 & 给Edge浏览器配置IE Tab插件已经提到了打开OPNET Modeler打开帮助文档的方法&#xff0c;有时候打开时会显示如下。 界面中没有什么内容加载出来&#xff01;我是在Google浏览器中打开的&#xff0c;其他的浏览器也是一样…

为何多参数遥测终端机成为了当今智能化监测领域的核心工具?

近年来&#xff0c;政府出台了一系列政策&#xff0c;加强了水文/水资源监测和管理的力度&#xff0c;推动了智能化监测技术的发展。根据国家统计局的数据&#xff0c;我国水文/水资源监测站点数量不断增加&#xff0c;监测范围不断扩大&#xff0c;监测数据的质量和精度也不断…

深入了解队列:探索FIFO数据结构及队列

之前介绍了栈&#xff1a;探索栈数据结构&#xff1a;深入了解其实用与实现&#xff08;c语言实现栈&#xff09; 那就快马加鞭来进行队列内容的梳理。队列和栈有着截然不同的工作方式&#xff0c;队列遵循先进先出&#xff08;FIFO&#xff09;的原则&#xff0c;在许多场景下…

共享目录防火墙

导语&#xff1a; 为什么需要配置文件夹共享功能&#xff1f; 我们在工作和生活中经常有需要将自己的文件复制给他人或者将他人的文件复制过来的需求。 有时候我们使用u盘&#xff0c;有时候我们使用qq或者飞秋等软件&#xff0c;但是u盘和软件并不是万能的&#xff0c;比如没…

(10)Linux冯诺依曼结构操作系统的再次理解

&#x1f4ad; 前言&#xff1a;本章我们首先会明确冯诺依曼体系结构的概念&#xff0c;旨在帮助大家理解体系结构在硬件角度去理解数据流走向的问题。理解完之后我们再去谈操作系统、更多有关操作系统的细节&#xff0c;着重谈谈操作系统概念与定位、操作系统是如何去做管理的…

聚观早报 |吉利银河E8将上市;三星Galaxy S24将登场

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 12月26日消息 吉利银河E8将上市 三星Galaxy S24将登场 哪吒L内饰曝光 苹果首款MR头显正量产 IEEE全球研究报告 …

使用防火墙是否可以应对DDoS攻击?

很多游戏行业公司对网络安全不够了解&#xff0c;觉得装个防火墙就可以万事大吉了。实际上使用防火墙确实是解决DDoS攻击问题的一种有效方法&#xff0c;一些更先进的防火墙还可以采用其他防御措施&#xff0c;例如:深度包检测、行为分析、人工智能等&#xff0c;来识别和防御各…

Zookeeper-一致性协议ZAB

ZAB协议介绍 ZAB 协议全称&#xff1a;Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子广播协议&#xff09;。 Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面&#xff0c;Zookeeper 并没有使用 Paxos &#xff0c;而是采用了…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(3)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识&#xff08;2&#xff09; 1.1 PCI总线的组成 如前文所述&#xff0c;PCI总线作为处理器系统的本地总线&#xff0c;是处理器系统的一个组成部件。因此&#xff0c;讲述PCI总线的…

​ iOS技术博客:App备案指南

&#x1f4dd; 摘要 本文介绍了移动应用程序&#xff08;App&#xff09;备案的重要性和流程。备案是规范App开发和运营的必要手段&#xff0c;有助于保护用户权益、维护网络安全和社会秩序。为了帮助开发者更好地了解备案流程&#xff0c;本文提供了一份最新、最全、最详的备…

分布式训练通信NCCL之Ring-Allreduce详解

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

PostgreSQL 可观测性最佳实践

简介 软件简述 PostgreSQL 是一种开源的关系型数据库管理系统 (RDBMS)&#xff0c;它提供了许多可观测性选项&#xff0c;以确保数据库的稳定性和可靠性。 可观测性 可观测性&#xff08;Observability&#xff09;是指对数据库状态和操作进行监控和记录&#xff0c;以便在…

【Linux系统基础】(3)在Linux上部署运维监控Zabbix和Grafana

目录 运维监控Zabbix部署简介安装安装前准备 - Mysql安装Zabbix Server 和 Zabbix Agenta. 安装Zabbix yum库b. 安装Zabbix Server、前端、Agentc. 初始化Mysql数据库d. 为Zabbix Server配置数据库e. 配置Zabbix的PHP前端 配置zabbix 前端&#xff08;WEB UI&#xff09; 运维监…

HTML代码全解析

HTML代码全解析实例解析 <!DOCTYPE html> 声明为 HTML5 文档<html> 元素是 HTML 页面的根元素<head> 元素包含了文档的元&#xff08;meta&#xff09;数据&#xff0c;如 <meta charset"utf-8"> 定义网页编码格式为 utf-8。<title> 元…

计算机毕业设计 基于SpringBoot的高校宣讲会管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…
最新文章