6.12找树左下角的值(LC513-M)

算法:

这道题适合用迭代法,层序遍历:按层遍历,每次把每层最左边的值保存、更新到result里面。

看看Java怎么实现层序遍历的(用队列):

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {//定义全局变量result// public List<List<Integer>> result = new ArrayList<List<Integer>>();public List<List<Integer>> result = new ArrayList<List<Integer>>();public List<List<Integer>> levelOrder(TreeNode root) {chek(root);return result;}public void chek(TreeNode node) {if (node == null) return;Queue<TreeNode> que = new LinkedList<TreeNode>();//在 Java 中,当调用类的构造函数时,使用括号可以传递参数或指定初始化的大小。如果没有传递参数,则会使用默认的构造函数。//虽然在这种情况下使用括号是可选的,但建议使用括号,以提高代码的可读性和一致性。此外,如果将来需要在构造函数中传递参数或指定初始化大小,添加括号将更加方便。//把node加入queque.offer(node);while(!que.isEmpty()){//itemlist用来存储每一层的节点List<Integer> itemlist = new ArrayList<Integer>();//len表示每一层的节点数量int len = que.size();while (len>0){TreeNode tempt = que.poll();itemlist.add(tempt.val);if (tempt.left != null) que.offer(tempt.left);if (tempt.right != null) que.offer(tempt.right);len--;}result.add(itemlist);}}
}

注意:

Java里面有全局变量:

即所有函数都可以用的变量,比如result

写函数还有定义变量时,要拼写正确并区分大小写:

比如isEmpty,ArrayList等

Java定义变量:

<数据类型> <变量名> = <初始值>;

  • `<数据类型>`:表示变量的数据类型,例如`int``double``String`等。
  • `<变量名>`:表示变量的名称,由字母、数字和下划线组成,不能以数字开头,且不能使用Java的关键字作为变量名。
  • `<初始值>`:表示变量的初始值,可以是一个具体的数值、表达式或者其他变量的值。如果不需要初始值,可以将其省略。

比如:List<Integer> itemList = new ArrayList<Integer>();

其中`List<Integer>`表示列表的数据类型(整数类型的列表),`itemList`是变量的名称,`new ArrayList<Integer>()`是初始值,创建了一个`ArrayList`类型的对象,并将其赋值给`itemList`变量。

ArrayList和LinkedList的区别:

ArrayList:
  • 内部实现:`ArrayList`基于数组的实现。它使用动态数组来存储元素,并可以根据需要自动调整容量。当元素数量超过当前容量时,`ArrayList`会自动增加容量,以便能够容纳更多的元素。
  • 随机访问:由于`ArrayList`基于数组,因此支持快速的随机访问。可以通过索引直接访问元素,时间复杂度为O(1)。
  • 插入和删除:在中间位置插入或删除元素时,需要将后续元素进行移动,因此时间复杂度为O(n)。但在末尾进行插入和删除操作时,时间复杂度为O(1)。
  • 内存占用:由于`ArrayList`使用连续的内存块来存储元素,因此在存储大量元素时,可能会导致内存碎片问题。
LinkedList:
  • 内部实现:`LinkedList`基于链表的实现。它使用双向链表来存储元素,每个节点包含对前一个节点和后一个节点的引用。
  • 随机访问:由于`LinkedList`是基于链表的,因此不支持快速的随机访问。要访问特定索引的元素,需要从头节点或尾节点开始遍历链表,时间复杂度为O(n)。
  • 插入和删除:在中间位置插入或删除元素时,只需要修改节点的引用,时间复杂度为O(1)。但在末尾进行插入和删除操作时,需要先遍历到末尾节点,时间复杂度为O(n)。
  • 内存占用:由于`LinkedList`使用链表存储元素,每个节点需要额外的内存空间来保存前后节点的引用,因此在存储大量元素时,可能会占用更多的内存。

add和offer的区别:

在 Java 中,`add` 和 `offer` 是用于向队列(Queue)添加元素的方法,它们有一些区别:

  1. 返回值:`add` 方法在成功添加元素后会返回 `true`如果无法添加元素(例如队列已满),则会抛出异常(`IllegalStateException` 或其子类)。而 `offer` 方法在成功添加元素后会返回 `true`如果无法添加元素(例如队列已满),则会返回 `false`。

  2. 异常处理:`add` 方法在无法添加元素时会抛出异常,而 `offer` 方法在无法添加元素时则会返回 `false`,不会抛出异常。这使得在使用 `offer` 方法时,可以通过返回值来判断元素是否成功添加,而无需使用异常处理机制。

  3. 接口支持:`add` 方法定义在 `Collection` 接口中,而 `offer` 方法定义在 `Queue` 接口中。由于 `Queue` 是 `Collection` 的子接口,所以所有实现了 `Queue` 接口的类都会包含 `offer` 方法。而 `add` 方法在一些特定的队列实现中可能没有定义。

总的来说,`add` 和 `offer` 方法在添加元素时的行为基本相同,但在处理无法添加元素的情况时有所不同。如果需要处理无法添加元素的情况,可以使用 `offer` 方法并根据返回值进行判断。如果希望抛出异常来处理无法添加元素的情况,可以使用 `add` 方法。

使用层序遍历找树左下角的值:

调试过程:

原因:当`i`等于`len`时,表示已经遍历完当前层级的所有节点。此时tempnode就是空节点,没有val。所以要把for循环条件改为i<len

正确代码:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int findBottomLeftValue(TreeNode root) {Queue<TreeNode> que = new LinkedList<>();que.offer(root);int res = 0;while (!que.isEmpty()){int len = que.size();for (int i=0; i< len; i++){TreeNode tempnode = que.poll();if (i == 0) res = tempnode.val;if (tempnode.left != null) que.add(tempnode.left);if (tempnode.right != null) que.add(tempnode.right);}            }return res;} 
}

时间空间复杂度

在这段代码中,使用了广度优先搜索(BFS)来遍历二叉树的每一层节点,因此时间复杂度为O(N),其中N是二叉树中的节点数。

空间复杂度方面,使用了一个队列`que`来存储节点,最坏情况下队列的大小可以达到二叉树的最大宽度,因此空间复杂度为O(W),其中W是二叉树的最大宽度。 综上所述,时间复杂度为O(N),空间复杂度为O(W)。

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

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

相关文章

mysql从库设置为只读

直奔主题&#xff0c;mysql设置为只读后&#xff0c;无法增删改。 设置命令&#xff1a; mysql> set global read_only1; #1是只读&#xff0c;0是读写 mysql> show global variables like %read_only%; 以下是相关说明&#xff1a; 1、对于数据库读写状态&#xf…

Nginx(八) aio sendfile directio 组合使用测试(1)

测试输出日志太多&#xff0c;文章篇幅太长&#xff0c;所以没法一次性发布&#xff0c;只能拆成两部分了。 Nginx(九) aio & sendfile & directio 组合使用测试(2) 还是依照惯例&#xff0c;先上结论&#xff1a; 1、当开启aio&#xff0c;关闭sendfile时&#xff0…

文件搜索工具HoudahSpot mac中文版特点

HoudahSpot mac是一款文件搜索工具&#xff0c;它可以帮助用户快速准确地找到文件和文件夹&#xff0c;支持高级搜索和过滤&#xff0c;同时提供了多种视图和操作选项&#xff0c;方便用户进行文件管理和整理。 HoudahSpot mac软件特点 高级搜索和过滤功能&#xff1a;软件支持…

HarmonyOS开发者工具DevEco Studio-汉化

HarmonyOS DevEco Studio 简介 下载安装及汉化 打开开发者工具 安装语言包重启 然后设置页搜索“chinese”&#xff0c;选中中文语言包&#xff0c;点击后面的install&#xff1b; 或者 汉化按照IDEA的汉法风格&#xff0c;需要安装插件重启就可以汉化&#xff0c;步骤为&…

[C/C++]数据结构 堆的详解

一:概念 堆通常是一个可以被看做一棵完全二叉树的数组对象,它是一颗完全二叉树,堆存储的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并且需要满足每个父亲结点总小于其子节点(或者每个父亲结点总大于其子节点) 堆可以分为两种: 小堆: 任意一个父亲节点都小于其子…

MySQL性能优化,SQL调优,SQL调优的手段

文章目录 对MySQL性能的优化的理解硬件和操作系统层面的优化架构设计层面的优化MySQL程序配置优化SQL优化 SQL调优有哪几种方式1.EXPLAIN2.SQL语句中IN包含的值不应过多3.SELECT语句务必指明字段名称4.当只需要一条数据的时候&#xff0c;使用limit 15.如果排序字段没有用到索引…

二叉树算法—后继节点

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 1 后继节点1.1 解题思路1.2 代码实现 &#x1f48e;总结 1 后继节点 1.1 解题思路 二叉树节点结构定义如下&#xff1a; public static class Node { public int cal; public Node left; public Node right; public…

深度学习中的注意力机制:原理、应用与实践

深度学习中的注意力机制&#xff1a;原理、应用与实践 摘要&#xff1a; 本文将深入探讨深度学习中的注意力机制&#xff0c;包括其原理、应用领域和实践方法。我们将通过详细的解析和代码示例&#xff0c;帮助读者更好地理解和应用注意力机制&#xff0c;从而提升深度学习模…

100天精通Python(可视化篇)——第109天:Pyecharts绘制各种常用地图(参数说明+代码实战)

文章目录 专栏导读一、地图应用场景二、参数说明1. 导包2. add函数 三、地图绘制实战1. 省市地图2. 中国地图3. 中国地图&#xff08;带城市&#xff09;4. 中国地图&#xff08;分段型&#xff09;5. 中国地图&#xff08;连续型&#xff09;6. 世界地图7. 行程轨迹地图8. 人口…

WordPress最廉价优化整站的加载速度

为什么说一个站不优化就等于一个人做整个团队的事务导致项目进展慢&#xff0c;网站也是如此 图片、静态文件、php分离加速&#xff0c;加载速度并不是很快但是很协调比单个网站加载速度快许多 一、图片单域名加载设置上传文件路径和域名 以下代码添加在主题目录&#xff1a;fu…

C# WPF上位机开发(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前很少用到c#语言&#xff0c;大部分时间都用c/c&#xff0c;主要是它可以兼顾上位机qt开发以及嵌入式开发。所以&#xff0c;用c/c是比较合理的…

U-boot(五):启动内核

本文主要探讨210的uboot启动内核过程。 嵌入式系统状态启动 未上电时bootloader、kernel、rootfs以镜像形式存储在启动介质中(X210为iNand/SD卡),运行时搬运到DDR中 未上电时u-boot.bin,zImage,rootfs在SD卡中各自对应的分区中,启动时去对应分区寻找(分区表一…