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

news2024/11/17 21:51:07

一、题目描述

给你二叉树的根节点 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.coloradmin.cn/o/1884388.html

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

相关文章

ARM功耗管理软件之DVFSAVS

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理软件栈及示例&#xff1f;WFI&WFE&#xff1f;时钟&电源树&#xff1f;DVFS&AVS&#xff1f; 目录 一、ARM功耗管理软件之DVFS 二、ARM功耗管理软件之AVS 一、ARM功耗管理软件之DVFS 有一个实现特定…

招生报名系统教培招生小程序

招生报名系统&#xff1a;轻松实现教培招生新高度 &#x1f680; 招生报名系统&#xff0c;开启智慧教育新时代 在当今数字化快速发展的时代&#xff0c;教育行业也迎来了变革的浪潮。招生报名系统作为这一变革的先锋&#xff0c;为教育机构提供了全新的招生渠道和管理方式。通…

jmeter-beanshell学习1-vars使用获取变量和设置变量

最近又开始了用jmeter做自动化&#xff0c;不管怎么实现&#xff0c;都逃离不了用beanshell&#xff0c;最后把所有校验都放在了beanshell判断&#xff0c;效果还不错。 首先jmeter有很多beanshell相关的元件&#xff0c;取样器、前置处理器、后置处理器、断言&#xff0c;暂时…

传输距离3000M|低延迟|48K采样音频传输模块-SA356大功率发射模块

无线音频应用中&#xff0c;远距离音频传输在许多领域具有广泛的应用需求&#xff0c;例如大型会议系统、公共广播、户外活动和音乐演出等。为了满足这些需求&#xff0c;音频传输模块需要具备一些关键特性&#xff0c;包括长距离传输能力、高音质、低延迟、稳定性以及抗干扰能…

UE5 动画蓝图

文章目录 一、State Machines二、Blend Spaces三、Aim Offset四、Montage 初步介绍 Unreal Engine 5 Tutorial - Animation Blueprint Part 1: State Machines (youtube.com) Unreal Engine 5 Tutorial - Animation Blueprint Part 2: Blend Spaces (youtube.com) Unreal Engi…

RK3568平台(USB篇)TYPE-C接口与PD协议

一.TYPE-C接口简介 type-c 插座&#xff1a; type-c 插头&#xff1a; type-c 线缆&#xff1a; type-c 接口定义之插座&#xff1a; type-c 硬件原理图&#xff1a; VBUS&#xff1a;供电引脚&#xff0c;用于传输电源电压&#xff0c;一般为5V或12V。 GND&#xff1a;地引…

类与对象(3)

1.首先我们先介绍一下 赋值重载 我们来举个例子来实现一下 赋值重载也叫赋值拷贝 void operator(const Date& d){//赋值拷贝 是拷贝给一个已经赋值好的对象 也叫赋值重载cout << "赋值重载" << endl;year d.year;month d.month;day d.day;} 如果…

Linux 高级编程——线程控制

线程控制&#xff1a;互斥与同步 概念&#xff1a; 互斥 》在多线程中对临界资源的排他性访问。 互斥机制 》互斥锁 》保证临界资源的 访问控制。 pthread_mutex_t mutex; 互斥锁类型 互斥锁变量 内核对象 框架&#xff1a; 定义互斥锁 》初始化锁 》加…

uniapp中如何进行微信小程序的分包

思路&#xff1a;在uniapp中对微信小程序进行分包&#xff0c;和原生微信小程序进行分包的操作基本上没区别&#xff0c;主要就是在pages.json中进行配置。 如图&#xff0c;我新增了一个包diver-page 此时需要在pages.json中的subPackages数组中新增一项 root代表这个包的根…

“论单元测试方法及应用”精选范文,软考高级论文,系统架构设计师论文

论文真题 1、概要叙述你参与管理和开发的软件项目,以吸你所担的主要工作。 2、结给你参与管理和开发的软件项目&#xff0c;简要叙述单元测试中静态测试和动态测试方法的基本内容。 3、结给你惨与管理和研发的软件项目,体阐述在玩测试过程中,如何确定白盒测试的覆盖标准,及如…

Sourcecodester Fantastic Blog CMS v1.0 SQL 注入漏洞(CVE-2022-28512)

前言 CVE-2022-28512 是一个存在于 Sourcecodester Fantastic Blog CMS v1.0 中的 SQL 注入漏洞。攻击者可以通过 "/fantasticblog/single.php" 中的 id 参数注入恶意 SQL 查询&#xff0c;从而获得对数据库的未经授权的访问和控制。 漏洞详细信息 漏洞描述: 该漏…

QML学习——Qt Quick Extras Examples 1.4(八)

Qt Quick Extras Examples 阅读官方的源码然后尝试做了下 01 A car dashboard 样例演示&#xff1a; 说明&#xff1a; ValueSource组件控制数值相关的动画&#xff0c;例如图中数值的变化&#xff1b;TurnIndicator组件是控制左右方向灯的闪烁和背景&#xff0c;里面使用…

深入解析HDFS:定义、架构、原理、应用场景及常用命令

引言 Hadoop分布式文件系统&#xff08;HDFS&#xff0c;Hadoop Distributed File System&#xff09;是Hadoop框架的核心组件之一&#xff0c;它提供了高可靠性、高可用性和高吞吐量的大规模数据存储和管理能力。本文将从HDFS的定义、架构、工作原理、应用场景以及常用…

【Kotlin】Kotlin 基础语法指南

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

vue项目手机录音

手机实现录音功能&#xff0c;安卓和苹果都可。功能&#xff0c;点击开始录制录音后&#xff0c;随时可以停止录音&#xff0c;如果不点击停止最多录制15秒。 页面结构 <!--音频--> <div class"audio-box"><audio id"audioPlayer"controlsc…

excel修改批量一列单价的金额并保留1位小数

1.打开表格&#xff0c;要把单价金额变成现在的两倍&#xff0c;数据如下&#xff1a; 2.把单价这一列粘贴到一个新的sheet页面&#xff0c;在B2单元格输入公式&#xff1a;A2*2 然后按enter回车键,这时候吧鼠标放到B2单元格右下角&#xff0c;会出现一个黑色的小加号&#xf…

泰国火出圈的slots游戏联动本土网盟广告推广优势

泰国火出圈的slots游戏联动本土网盟广告推广优势 在泰国&#xff0c;Slots游戏凭借其独特的魅力和吸引力&#xff0c;迅速成为玩家们的热门选择。然而&#xff0c;要在竞争激烈的市场中脱颖而出&#xff0c;推广策略显得尤为重要。本土网盟广告以其独特的优势&#xff0c;为Sl…

制氢厂氢气泄漏安全监测:氢气传感器守护“氢”安全

随着全球能源结构的转型和清洁能源的需求日益增长&#xff0c;氢能作为一种高效、清洁的能源载体&#xff0c;受到了广泛关注。制氢厂作为氢能产业的重要组成部分&#xff0c;其安全问题也日益凸显。在制氢过程中&#xff0c;氢气泄漏是潜在的安全隐患之一&#xff0c;因此&…

数据结构/作业/2024/7/11

1.在堆区申请两个长度为32的空间&#xff0c;实现两个字符串的比较【非库函数实现】 #include <stdio.h> #include <stdlib.h> void input(char*p); void my_strcmp(char *p1,char *p2); int main(int argc, const char *argv[]) {//申请内存空间32个字节 char *p…

vue3 elementplus Springboot 课程购买系统案例源码

系统演示 项目获取地址 Springboot vue3 elementplus 课程购买系统案例源码 附带系统演示&#xff0c;环境搭建教程,开发工具 技术栈:SpringBoot Vue3 ElementPlus MybatisPlus 开发工具:idea 后端构建工具:Maven 前端构建工具:vite 运行环境:Windows Jdk版本:1.8 Nod…