102. 二叉树的层序遍历

题目描述

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

自己想到的笨方法

/*** Definition for a binary tree node.* public class TreeNode {*     public var val: Int*     public var left: TreeNode?*     public var right: TreeNode?*     public init() { self.val = 0; self.left = nil; self.right = nil; }*     public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }*     public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {*         self.val = val*         self.left = left*         self.right = right*     }* }*/
class Solution {func levelOrder(_ root: TreeNode?) -> [[Int]] {var ret = [[Int]]()guard let root = root else {return ret}var elementRet = [Int]()var enumQueue: [TreeNode] = [root]var waittingQueue = [TreeNode]()while !enumQueue.isEmpty {let first = enumQueue.removeFirst()elementRet.append(first.val)if let left = first.left {waittingQueue.append(left)}if let right = first.right {waittingQueue.append(right)}if enumQueue.isEmpty {ret.append(elementRet)elementRet.removeAll()enumQueue.append(contentsOf: waittingQueue)waittingQueue.removeAll()}}return ret}
}

更优的解法

要实现二叉树的层序遍历,可以使用广度优先搜索(BFS)算法。通过逐层遍历树的节点,可以按照从上到下、从左到右的顺序获取所有节点的值。

具体步骤如下:

  1. 如果树为空,返回空列表。
  2. 使用一个队列进行层次遍历,首先将根节点入队。
  3. 初始化一个结果列表。
  4. 当队列不为空时,遍历当前层的所有节点,并将这些节点的值存入当前层的列表中,然后将它们的子节点(如果有)加入队列。
  5. 将当前层的列表加入结果列表中。
  6. 返回结果列表。

以下是完整的 Swift 代码实现:

class Solution {func levelOrder(_ root: TreeNode?) -> [[Int]] {// 如果根节点是 nil,返回空列表guard let root = root else {return []}var result: [[Int]] = []var queue: [TreeNode] = [root]// 当队列不为空时,进行层次遍历while !queue.isEmpty {var level: [Int] = []let levelSize = queue.count// 遍历当前层的所有节点for _ in 0..<levelSize {let currentNode = queue.removeFirst()level.append(currentNode.val)// 将当前节点的左子节点加入队列(如果有的话)if let leftChild = currentNode.left {queue.append(leftChild)}// 将当前节点的右子节点加入队列(如果有的话)if let rightChild = currentNode.right {queue.append(rightChild)}}// 将当前层的列表加入结果列表中result.append(level)}return result}
}

解释:

  • 初始化:如果树为空(即 root == nil),返回空列表 []
  • 广度优先搜索(BFS):使用一个队列 queue 进行层次遍历,初始时将根节点入队。
  • 层次遍历:当队列不为空时,进行层次遍历。记录当前层的节点数 levelSize,遍历当前层的所有节点,将它们的值存入 level 列表中,然后将它们的子节点(如果有)加入队列。
  • 更新结果:每遍历完一层,将当前层的值列表 level 加入结果列表 result 中。
  • 返回结果:最终返回结果列表 result,其中包含了每一层的节点值。

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

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

相关文章

【已解决】better-scroll在PC端如何开启鼠标滚动以及如何始终显示滚动条

总结 需要安装插件 mouse-wheel 和 scrollbar 在PC端如何开启鼠标滚动? 需要安装官方提供的滚动插件&#xff1a;mouse-wheel https://better-scroll.github.io/docs/zh-CN/plugins/mouse-wheel.html 为了开启鼠标滚动功能&#xff0c;你需要首先引入 mouseWheel 插件&…

光伏工程开发的详细步骤

光伏工程作为可再生能源领域的重要组成部分&#xff0c;其开发过程涉及多个环节&#xff0c;包括开发、测绘、设计、施工和运维等。下面将详细介绍这些步骤。 一、开发阶段 1、前期调研&#xff1a;对目标地区进行能源政策、市场需求、资源条件等方面的调研&#xff0c;评估项…

python 逻辑控制语句、循环语句

文章目录 一、逻辑控制语句&#xff08;if、elif、else&#xff09; 一、逻辑控制语句&#xff08;if、elif、else&#xff09; Python 条件语句是通过一条或多条语句的执行结果&#xff08;True或者False&#xff09;来决定执行的代码块。 python 基本的逻辑判断语法&#xff…

SuperMap GIS基础产品FAQ集锦(20240617)

一、SuperMap iDesktopX 问题1&#xff1a;请问udbx数据源的数据集最多支持多少个属性字段&#xff1f; 现在客户合并数据集后属性字段有1119个&#xff0c;导致无法复制数据集 11.1.1 【问题原因】理论上是没有上限&#xff0c;我们底层没有针对这点进行限制&#xff0c;通常…

性能优化篇

1、使用 Class 代替 ProtoBuf 协议 因为 ProtoBuf 采用的是 Arena 内存分配器策略&#xff0c;有些场景会比 C的 Class 内存管理复杂&#xff0c;当有大量内存分配和释放的时候会比 Class 的性能差很多。而且 Protobuf 会不断分配和回收小内存对象&#xff0c;持续地分配和删除…

.gitignore文件忽略的内容不生效问题解决

文章目录 ①&#xff1a;现象②&#xff1a;原因③&#xff1a;解决 ①&#xff1a;现象 在已经提交过的git管理的项目中&#xff0c; 新增加一个.gitignore文件&#xff0c;文件内忽略内容不生效或者修改.gitignore文件之后&#xff0c;文件内新增的忽略内容不生效 ②&#…

了解 Blazor Server App 项目结构

在本文中&#xff0c;你将获得以下问题的答案 先决条件如何创建 Blazor Server App 项目&#xff1f;Blazor Server 应用程序的项目结构是什么样的&#xff1f;每个默认文件夹有什么用如何设置启动razor组件或页面运行&#xff1f; 先决条件 HTML、CSS 和 Javascript 的基本…

如何使用任意浏览器远程访问本地搭建的Jellyfin影音平台

文章目录 前言1. Jellyfin服务网站搭建1.1 Jellyfin下载和安装1.2 Jellyfin网页测试 2.本地网页发布2.1 cpolar的安装和注册2.2 Cpolar云端设置2.3 Cpolar本地设置 3.公网访问测试4. 结语 前言 本文主要分享如何使用Windows电脑本地部署Jellyfin影音服务并结合cpolar内网穿透工…

如何在招聘中开始使用AI?

在人工智能时代&#xff0c;招聘团队面临着“用更少的钱做更多的事情”的压力&#xff1a;用更少的钱和更少的团队。根据一项调查&#xff0c;58%的受访者认为&#xff0c;“提高我们助教团队的效率&#xff0c;降低成本”是明年招聘职位的首要任务。在招聘中使用人工智能是提高…

【机器学习300问】119、什么是语言模型?

语言模型&#xff08;Language Models&#xff09;是自然语言处理&#xff08;NLP&#xff09;的重要组成部分&#xff0c;它的目的是量化一段文本或一个序列的概率。简单讲就是你给语言模型一个句子&#xff0c;它给你计算出特定语言中这个句子出现的概率。这样的概率度量可以…

Linux的操作命令

Linux的操作命令 &#xff08;1&#xff09;使用命令切换到/etc目录&#xff0c;并显示当前工作目录路径。 切换到/etc目录&#xff1a; cd /etc显示当前工作目录路径&#xff1a; pwd当你运行pwd命令时&#xff0c;你应该看到输出为/etc。 &#xff08;2&#xff09;使用命…

【Netty】nio阻塞非阻塞Selector

阻塞VS非阻塞 阻塞 阻塞模式下&#xff0c;相关方法都会导致线程暂停。 ServerSocketChannel.accept() 会在没有建立连接的时候让线程暂停 SocketChannel.read()会在没有数据的时候让线程暂停。 阻塞的表现就是线程暂停了&#xff0c;暂停期间不会占用CPU&#xff0c;但线程…

Excel 常用技巧(四)

Microsoft Excel 是微软为 Windows、macOS、Android 和 iOS 开发的电子表格软件&#xff0c;可以用来制作电子表格、完成许多复杂的数据运算&#xff0c;进行数据的分析和预测&#xff0c;并且具有强大的制作图表的功能。由于 Excel 具有十分友好的人机界面和强大的计算功能&am…

Compose 可组合项 - 抽屉式导航栏 Drawer

官方介绍 参考文章 一、概念 Scafford 在 material 包下可以设置 drawerContent&#xff0c;在 material3 包下已经没有。 PermanentNavigationDrawer抽屉栏永久显示&#xff0c;占用屏幕。ModalNavigationDrawer抽屉栏打开时覆盖在屏幕上。DismissibleNavigationDrawer抽屉栏…

自定义异常与全局异常处理

1. 自定义异常 1.1 创建自定义异常类 当存在业务逻辑不通畅时,我们可以将其定义为异常,由于在代码中本质不是异常,所以需要我们自定义异常,这种异常也叫做业务异常 如下定义: package com.imooc.mall.exception;/*** 自定义业务异常类* 继承异常Exception 或者RuntimeExcep…

直播美颜SDK技术指南:实现实时美颜效果的算法方案

本篇文章&#xff0c;小编将探讨直播美颜SDK的技术实现和算法方案。 一、美颜技术概述 美颜技术通过一系列图像处理算法&#xff0c;实时美颜效果可以在视频直播过程中实时呈现&#xff0c;提升用户的直播体验。为了实现这些效果&#xff0c;需要结合图像处理和计算机视觉技术…

生产 的mybatisplus 日志输入到日志文件

默认是输出到控制台.不输出到日志文件 输出到日志文件.需要修改配置 第一步. logging:config: classpath:logback-wshoto.xml第二步 mybatis-plus:configuration:cache-enabled: truedefault-executor-type: reuselog-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl第三步…

别太小看“静态免杀“

0x01 简述 免杀总体来说可分为两种&#xff0c;静态免杀/动态免杀。往往来说&#xff0c;我们更注重于在内部代码层面实现一些免杀技巧&#xff0c;但在有些时候&#xff0c;动态免杀静态免杀以"打组合拳"的方式效果往往会更出人所料。 当我们的程序生成后&#xf…

Spring IOC 控制反转(注解版)

Spring IOC 控制反转 文章目录 Spring IOC 控制反转一、前言什么是控制反转&#xff08;IOC&#xff09;什么是依赖注入&#xff08;DI&#xff09; 二、介绍 IOC2.1 传统思想代码2.2 解决方案2.3 IOC思想代码2.4 IOC 使用&#xff08;Autowired依赖注入&#xff09;2.5 IOC 优…

从零开始学GeoServer源码(一)(搭建开发环境Win10+IDEA23.3.5+jdk11+geoserver2.24.x)

搭建开发环境 参考资料 0、基础环境准备0.1、idea0.2、jdk0.3、源码 1、导入工程2、配置启动环境2.1、打开新增配置面板2.2、配置工作目录2.2.1、从常用配置中选择2.2.2、直接粘贴 2.3最终效果 3、调整源码3.1、添加maven引用3.2、注释无效代码3.3、删除测试代码 4、修改运行端…