6.3二叉树的层序遍历(LC102,LC107-M)

二叉树的层序遍历(LC102):

算法(长度法):

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

举个例子模拟一下:

对于空队列queue,创建一个level用于储藏每一层的值,创建应该result用于合并level。通过记录队列的长度,来判断level里面可以放多少个数:

  1. push入6,记录此时的len(queue)==1
  2. 将当前层元素弹出:leftpop 6\\level=[6],len(queue)==0
  3. push入6的左子树根节点4,此时的len(queue)==1
  4. push入6的右子树根节点7,此时的len(queue)==2\\queue = [4,7]
  5. 由于len(queue)==2,所以接下来只弹出两个元素
    1. 首先popleft 4
    2. push入4的左子树根节点1\\queue=[7,1]
    3. push入4的右子树根节点3\\queue=[7,1,3]
    4. 接着popleft 7\\ len(queue)==0,level=[4,7]
    5. push入7的左子树根节点5\\queue=[1]
    6. push入7的右子树根节点8,此时的len(queue)==4\\queue=[1,3,5,8]
  6. 由于len(queue)==4,所以接下来弹出4个元素
  7. level = [1,3,5,8]
  8. 最后的result = [[6], [4,7], [1,3,5,8]]

正确代码:

from collections import deque
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        res = []
        if root == None:
            return res
        else:
            queue = deque([root])
            #只要queue非空,就要一直操作
            while queue:
                level = []
                #通过queue的长度控制弹出的个数
                for _ in range(len(queue)):
                    node = queue.popleft()
                    level.append(node.val)
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                #把level的结果都放到res里面
                res.append(level)
            return res


时间空间复杂度:

时间复杂度为O(n),其中n为二叉树中的节点个数,因为每个节点都会被访问一次。

空间复杂度为O(m),其中m为二叉树中每一层的最大节点个数,即为队列`queue`的最大长度。

二叉树的层序遍历(LC107):

算法:就是把LC102复现以后,把结果反转一下

代码:

from collections import deque
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:

        res = []
        if root == None:
            return res
        else:
            queue = deque([root])
            #只要queue非空,就要一直操作
            while queue:
                level = []
                #通过queue的长度控制弹出的个数
                for _ in range(len(queue)):
                    node = queue.popleft()
                    level.append(node.val)
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                #把level的结果都放到res里面
                res.append(level)
            res [:] = res [::-1]
            return res


时间空间复杂度:

这段代码的时间复杂度为O(n),其中n为二叉树中的节点个数,因为每个节点都会被访问一次。空间复杂度为O(m),其中m为二叉树中每一层的最大节点个数,即为双端队列`queue`的最大长度。

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

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

相关文章

小型企业如何数字化转型?ZohoCRM助力小企业转型

小型企业数字化之路倍加艰难,其组织规模有限、资源有限,数字化布局或转型,也存在与数字平台匹配度的问题。其实小型企业可以通过CRM客户管理系统实现高效的客户关系管理,进一步提高市场竞争力。 建立高效易用的客户关系管理系统 …

程序员这个职业会在10年内被AI淘汰吗?

我认为程序员这个职业不会被AI淘汰,但程序员的工作内容会发生翻天覆地的变化。 回望历史的进程你就明白了:当纺纱机的出现带来了第一次工业革命,传统的纺织厂女工们陆续失业,但纺纱机并没有消失,而操作纺纱机的女工们…

带有密码的Excel只读模式,如何取消?

Excel文件打开之后发现是只读模式,想要退出只读模式,但是只读模式是带有密码的,该如何取消带有密码的excel只读文件呢? 带有密码的只读模式,是设置了excel文件的修改权限,取消修改权限,我们需要…

【MATLAB】设置图形透明度

1 Scatter散点图 % 设置散点大小 s.SizeData 100;散点标记符号设置如下: 在绘制散点图时,想设置透明度: 更改散点透明度后,图形如下: 相关绘图代码如下: figure(1) set(gcf, Units, figureUnits, Po…

Spring源码系列-框架中的设计模式

简单工厂 实现方式: BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 实质: 由一个工厂…

为什么OpenAPI是未来企业数字化转型的决定性因素

随着数字经济不断发展升级,数据互通、万物互联正在逐步成为IT产业发展的主旋律,企业数字化转型也变得愈发紧迫。越来越多的企业都在数字化转型过程中寻求降本增效、加大创新力度、开展生态合作,以此来提高企业和产品的持续竞争力。而OpenAPI则…

漏洞复现--奇安信360天擎未授权访问

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

fastadmin 表单页面,根据一个字段的值显示不同字段

表单中有计费方式&#xff0c;选中不同的计费方式显示不同的字段如下图 根据选择不同的计费方式&#xff1a;重量或夹板。展示不同相关字段&#xff1a;每件重量/每夹板件数量 add.html <div class"form-group"><label class"control-label col-xs-12…

班级新闻管理系统asp.net+sqlserver

班级新闻管理系统 附加功能 新闻图片&#xff0c;点击次数访问自增&#xff0c;每个人都只能增删改查自己发布的新闻&#xff0c;并可以看到所有人发布的新闻 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql serve…

halcon分割粘连字符

下面的算子都可以分割&#xff1a; 1.*&#xff08;推荐使用这个&#xff09;在垂直范围较小的位置水平划分区域 partition_dynamic(circleRegion,parRegion,76,50)2.*将一个区域划分为大小大致相等的矩形。&#xff08;这个方法适合宽度相等&#xff0c;很规则的排列的字符串…

恢复数据软件推荐,数据恢复,就用这款!

“我是个比较粗心的人&#xff0c;在使用电脑时经常会误删很多文件&#xff0c;请问大家有没有好用的数据恢复软件推荐呀&#xff1f;” 在数字时代&#xff0c;数据是我们生活和工作中的重要组成部分。然而&#xff0c;意外的数据丢失或删除可能会给我们带来巨大的麻烦。这时&…

划分VOC数据集,以及转换为划分后的COCO数据集格式

1.VOC数据集 LabelImg是一款广泛应用于图像标注的开源工具&#xff0c;主要用于构建目标检测模型所需的数据集。Visual Object Classes&#xff08;VOC&#xff09;数据集作为一种常见的目标检测数据集&#xff0c;通过labelimg工具在图像中标注边界框和类别标签&#xff0c;为…

【2021研电赛】管道巡检机器人

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 团队介绍 参赛单位&#xff1a;广西科技大学 参赛队伍&#xff1a;OMEN 参赛队员&#xff1a;吴海晨 陈永亮 乔亚坤 第1章 项目意义 1.1 研究背景及意义 据媒体报道&am…

Linux学习笔记之五(父子进程、孤儿进程、僵尸进程、守护进程)

Linux 1、进程1.1、进程的六种状态1.2、创建子进程1.3、添加子进程任务1.4、孤儿进程、僵尸进程、守护进程1.4.1、避免僵尸进程1.4.2、创建守护进程1.4.3、杀死守护进程 1.5、综合练习 1、进程 进程可以简单的理解为一个正在执行的程序&#xff0c;它是计算机系统中拥有资源和…

Ionic 组件 ion-item-divider ion-item-group ion-item-sliding ion-label ion-note

1 ion-item-divider Item dividers是块元素&#xff0c;可用于分隔列表中的items 。它们类似于列表标题&#xff0c;但它们不应该只放在列表的顶部&#xff0c;而应该放在items之间。 <ion-list><ion-item-group><ion-item-divider><ion-label> Secti…

使用小程序插件【用户信息功能页】获取用户昵称、头像、openid

摘要 因为获取用户信息的接口 wx.getUserInfo 存在滥用&#xff0c;使用不规范等原因&#xff0c;微信官方已经将这个接口权限回收&#xff0c;改为用户信息填写&#xff0c;即引导用户主动填写微信昵称和上传头像。这种做法确实是麻烦了点。 但是微信小程序插件&#xff0c;…

浏览器标签页之间的通信

前言 在开发管理后台页面的时候&#xff0c;会遇到这样一种需求&#xff1a;有一个列表页面&#xff0c;一个新增按钮&#xff0c;一个新增页面&#xff0c;点击新增按钮&#xff0c;在一个新的标签页中打开新增页面。并且&#xff0c;新增后要自动实时的更新列表页面的数据。…

机器学习概论

目录 一、机器学习概述 1、机器学习与人工智能、深度学习的关系 2、机器学习的范围 3、机器学习可以解决什么问题 给定数据的预测问题&#xff1a; 二、机器学习的类型 1、监督学习 分类&#xff08;Classification&#xff09; 回归&#xff08;Regression、Prediction&am…

Vue知识点总结

路由 使用 参数传递的两种方式 路由的params传参 路由的query传参 组件 概念 局部功能代码&#xff08;html、css js&#xff09;和资源(mp3 mp4 ttf .zip)的集合 非单文件组件 一个文件对应多个组件&#xff0c;以html结尾 使用 <xuexiao>即可使用 注意&#xf…

MySQL字符串需要注意的事项

char(N)&#xff0c;N在0-255间 varchar(N)&#xff0c;N在0-65536间 需要注意N是字符&#xff0c;不是字节&#xff0c;英文字母一个字符一个字节&#xff0c;阿拉伯字母一个字符两个字节&#xff0c;中文日文一个字符三个字节&#xff0c;emoji是一个字符四个字节 当今移动端…
最新文章