[LeetCode-Python版] 102. 二叉树的层序遍历(广度优先遍历,清晰图解)

ops/2024/12/17 18:16:27/

题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
在这里插入图片描述
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:
输入:root = [1]
输出:[[1]]

示例 3:
输入:root = []
输出:[]

题目链接

我的思路

用队列实现(因为队列有先入先出的特点)

  1. 处理极值
  2. 定义一个双向队列(collections.deque())和结果数组res
  3. 将根节点插入队列
  4. 定义循环,当队列不为空时循环继续
    • 每次循环弹出一个节点,记录节点的值到数组res
    • 判断左子树和右子树是否存在,如果存在则加入队列
  5. 返回结果

思路不足

  • 没有考虑每层的值应该放在一个数组里

题解思路

  • 新建一个临时列表 tmp ,用于存储当前层打印结果
  • 用两层循环而不是一层,内层循环遍历并弹出当前队列里所有的元素,值加入tmp数组
  • 内层循环结束后tmp数组加入res数组

参考代码

python"># 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 = rightfrom collections import deque
class Solution:def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:# 0.处理极端情况if root is None:return []deq = deque()res = []# 1.根入栈deq.append(root)# 2.循环,栈不为空while deq:tmp = []for _ in range(len(deq)):# 3.出栈,获取出栈元素的值node = deq.popleft()tmp.append(node.val)# 4.左子树入栈if node.left is not None:deq.append(node.left)# 5.右子树入栈if node.right is not None:deq.append(node.right)res.append(tmp)return res

Q&A

  1. 为什么for _ in range(len(deq))不会报错,for _ in deq会报错?
    在Python中,for _ in range(len(deq)) 和 for _ in deq 表面上看起来似乎做同样的事情,但实际上它们在处理队列(deque)时的行为是不同的。

    • for _ in range(len(deq)): 首先计算队列的长度,即 len(deq),然后循环这个固定的次数。在循环过程中,即使队列 deq 的长度发生了变化(元素添加或移除),循环的次数也不会改变,因为它在循环开始时就已经确定了。因此,这个循环不会因为队列的变化而报错。
    • for _ in deq:这个循环直接迭代队列中的元素。如果在迭代过程中队列被修改,迭代器会检测到这种变化,并抛出 RuntimeError: deque mutated during iteration 错误。这是因为Python的迭代器协议要求在迭代过程中,被迭代的对象应该是不可变的,以保证迭代器的状态和对象的状态保持一致
  2. 为什么左子树和右子树的插入要放在内层循环?
    如果在内层循环之外添加子节点,会在处理当前层的所有节点之前就将子节点添加到队列中,这可能导致某些节点被遗漏或者遍历顺序不正确
    例如:在这里插入图片描述


http://www.ppmy.cn/ops/142706.html

相关文章

Unity3D PCG场景同步耗时优化详解

前言 在Unity3D中,PCG(Procedural Content Generation,程序内容生成)技术通过算法自动或半自动生成游戏内容,如地图、关卡、角色等,从而提高游戏的可玩性和重复性。然而,PCG场景的同步和渲染可…

利用Python爬虫获取淘宝评论商品信息接口

引言 淘宝作为中国最大的电商平台之一,其商品评论信息对于市场分析和消费者决策具有重要价值。本文将介绍如何使用Python爬虫技术合法合规地获取淘宝评论商品信息接口数据。 环境准备 在开始之前,请确保你的开发环境中已安装以下工具和库:…

OSCP - Proving Grounds - DC-4

主要知识点 密码爆破潜在的包含密码的文件搜索在/etc/passwd 插入新用户提权 具体步骤 首先执行nmap 扫描,比较直接,80和22端口,22端口虽然有vulnerability,但是对咱们目前的情况来讲没有太大的帮助,主要关注一下80端口 Start…

HTML零基础教学(REAL)

什么是HTML 一种超文本标记语言: HyperText Markup Language 常见误区:HTML 不是一种编程语言,而是一种标记语言 标记语言是一套标记标签 HTML文档的别名web 页面 HTML 使用标记标签来描述网页 HTML 文档包含了HTML 标签及文本内容 入门 新建一个…

2.Linux - 基础结构及命令

Linux - 基础结构及命令 文章目录 Linux - 基础结构及命令一、目录二、基础命令2.1 ls2.2.1 选项使用2.2.2 参数使用 2.2 目录切换 cd/pwd2.3 路径2.4 创建目录 mkdir2.5 文件操作命令2.5.1 创建文件 touch2.5.2 查看文件内容 cat/more2.5.3 复制文件/文件夹 cp2.5.4 移动文件/…

Leetcode1847:最近的房间

题目描述: 一个酒店里有 n 个房间,这些房间用二维整数数组 rooms 表示,其中 rooms[i] [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一个房间号 roomIdi 保证是 独一无二 的。 同时给你 k 个查询&#xff…

22. 正则表达式

一、概述 正则表达式(regular expression)又称 规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式(规则&…

基于SpringBoot的“商务安全邮箱”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“商务安全邮箱”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构 收件箱效果图 草稿箱效果图 已发送效…