【Py/Java/C++三种语言详解】LeetCode每日一题240214【二叉树BFS】LeetCode102、二叉树的层序遍历

有LeetCode交流群/华为OD考试扣扣交流群可加:948025485
可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题
绿色聊天软件戳 od1336了解算法冲刺训练

文章目录

  • 题目链接
  • 题目描述
  • 解题思路
    • DFS和BFS异同
    • 用队列维护的BFS
  • 代码
    • Python
    • Java
    • C++
    • 时空复杂度
  • 相关习题
  • 华为OD算法/大厂面试高频题算法练习冲刺训练

题目链接

LeetCode102、二叉树的层序遍历

题目描述

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

示例 1

在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2

输入:root = [1]
输出:[[1]]

示例 3

输入:root = []
输出:[]

提示

  • 树中节点数目在范围 [0, 2000]
  • -1000 <= Node.val <= 1000

解题思路

DFS和BFS异同

二叉树层序遍历是一个非常经典的问题,属于必须掌握的题目。

所谓二叉树遍历(traversal)指的是按照一定次序系统地访问一棵二叉树,使每个节点恰好被访问一次

二叉树遍历实质上是二叉树的线性化,将树状结构变为线性结构

二叉树遍历有两大类:

  • 深度优先(depth first traversal,DFS):先完成一棵子树的遍历再完成另一棵
  • 广度优先(breath first traversal,BFS):先完成一层节点的遍历再完成下一层

DFS和BFS均为树/图的搜索方式,能够访问树/图中的所有节点。它们的特点可以从以下的比喻看出区别:

  • DFS:优先移动节点,当对给定节点尝试过每一种可能性之后,才退到前一节点来尝试下一个位置。就像一个搜索者尽可能地深入调查未知的地域,直到遇到死胡同才回头。(下图以前序遍历为例)

在这里插入图片描述

  • BFS:优先对给定节点的下一个位置进行进行尝试,当对给定节点尝试过每一种可能性之后,才移动到下一个节点。就像一只搜索军队铺展开来覆盖领土,直到覆盖了所有地域。

在这里插入图片描述

用队列维护的BFS

树的广度优先遍历亦可称为层序遍历。其核心特点为,从上到下、从左到右访问树中的节点,每一层的节点都按顺序出现。

在这里插入图片描述

本题就是二叉树BFS的板子题,必须掌握。

BFS通常需要通过维护一个先进先出 (First In First Out,FIFO) 的队列来实现。

在这里插入图片描述

我们需要构建一个队列q用于储存每一层的所有节点,然后执行while循环(循环不变量为q不为空):

  1. 获得当前队列长度qSize,为该层的节点个数
  2. 初始化一个空的子列表subList,用于储存二叉树该层所有节点的值
  3. 执行for循环,循环qSize次。每一次循环包含以下环节
    a. 令队列q的队头节点出队,记为node,并将其值node.val存入subList
    b. 若node的左孩子node.left存在,则令node.left从队尾入队
    c. 若node的右孩子node.right存在,则令node.right从队尾入队
    (这些后入队的节点会在下一层的遍历中被取出)
  4. 经过qSize次循环后,subList已经储存了这一层节点的所有值,将subList加入全局的答案变量ans

这样就就是二叉树BFS的基本过程,其中第3步是最关键的步骤

如果题目有明显地要求区分每一层的情况(比如本题要求每一层的节点值需要单独储存在一个子列表中),则循环qSize次这个步骤是必要的。

代码

Python

from collections import deque
class Solution:def levelOrder(self, root: TreeNode) -> List[List[int]]:if not root:    # 若根节点为空,返回一个空列表return []ans = list()    # 初始化答案列表q = deque()     # 维护一个队列,用于BFS过程q.append(root)  # 初始化队列,加入根节点while(len(q) != 0):     # 循环遍历,进行BFS,退出循环的条件是队列为空qSize = len(q)      # 获得当前队列的长度,为二叉树该层节点数subList = list()    # 初始化子列表,用于储存二叉树该层节点的值for i in range(qSize):          # 循环qSize次,遍历该层的节点node = q.popleft()          # 令队头的节点node出队subList.append(node.val)    # 将node的值加入子列表中if node.left:           # 若node的左节点存在,入队q.append(node.left)if node.right:          # 若node的右节点存在,入队q.append(node.right)ans.append(subList) # 经过循环qSize次后,将子列表加入答案列表return ans      # 退出while循环,返回答案列表

Java

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> ans = new ArrayList<>();if (root == null) {return ans;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();List<Integer> subList = new ArrayList<>();for (int i = 0; i < size; i++) {TreeNode node = queue.poll();subList.add(node.val);if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}ans.add(subList);}return ans;}
}

C++

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> ans;if (root == nullptr) {return ans;}queue<TreeNode*> q;q.push(root);while (!q.empty()) {int size = q.size();vector<int> subList;for (int i = 0; i < size; ++i) {TreeNode* node = q.front();q.pop();subList.push_back(node->val);if (node->left != nullptr) {q.push(node->left);}if (node->right != nullptr) {q.push(node->right);}}ans.push_back(subList);}return ans;}
};

时空复杂度

时间复杂度:O(N)。仅需一次遍历整棵树。

空间复杂度:O(M)M为层的最大节点数,队列所占空间。

相关习题

LeetCode101、对称二叉树

LeetCode102、二叉树的层序遍历

LeetCode103、二叉树的锯齿形层序遍历

LeetCode107、二叉树的层序遍历II

LeetCode199、二叉树的右视图

LeetCode429、N叉树的层序遍历

LeetCode513、找树左下角的值

LeetCode515、在每个树行中找最大值

LeetCode637、二叉树的层平均值

LeetCode655、输出二叉树

LeetCode662、二叉树的最大宽度

LeetCode993、二叉树的堂兄弟节点

LeetCode1161、最大层内元素和

LeetCode1302、层数最深叶子节点的和

LeetCode1609、奇偶树


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

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

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

相关文章

现代浏览器对 es模块 【esm】原生支持

现代浏览器对 ES&#xff08;ECMAScript&#xff09;模块的原生支持是指浏览器可以直接解析和执行 JavaScript 文件中的 ES 模块语法&#xff0c;无需额外的工具或转换。 具体来说&#xff0c;当浏览器遇到 import 和 export 关键字时&#xff0c;会将其识别为 ES 模块语法&…

Linux 基础/子目录分配/文件路径

在Linux系统中&#xff0c;整个系统只具有一个根目录“/”&#xff0c;用斜杠表示。根目录是整个文件系统的顶层目录&#xff0c;在他下面可以创建其他的目录和文件。 Linux中的子目录分配&#xff1a; /bin - 基本命令的二进制文件&#xff0c;这些命令可供所有用户使用&am…

MySQL主从环境,主库改端口后,从库如何操作?

主库&#xff1a;mysql-111 从库&#xff1a;mysql-112 主库由3306端口修改成3307后&#xff0c; 从库执行如下命令 mysql> stop slave; mysql> change master to master_port3307; mysql> CHANGE MASTER TO MASTER_HOST192.168.10.111,MASTER_USERbeifen,MASTER_PA…

生活中有很多压力,怎么办?

在这篇文章的最开始&#xff0c;我想跟你一起做一个思维实验&#xff1a; 假如现在有一个按钮&#xff0c;按下去之后&#xff0c;你会过上一段新的生活。这段生活的走向跟你原本生活的走向大体一样&#xff0c;不同之处在于&#xff1a;它会消除你未来生活中的一切压力。你将不…

BUGKU-WEB 矛盾

题目描述 进入场景看看&#xff1a; 代码如下&#xff1a; $num$_GET[num]; if(!is_numeric($num)) { echo $num; if($num1) echo flag{**********}; }解题思路 需要读懂一下这段PHP代码的意思明显是一道get相关的题目&#xff0c;需要提供一个num的参数,然后需要传入一个不…

【PyQt】12-滑块、计数控件

文章目录 前言一、滑块控件 QSlider运行结果 二、计数器控件 QSpinBox运行结果 总结 前言 1、滑块控件 2、计数控件 一、滑块控件 QSlider #Author &#xff1a;susocool #Creattime:2024/2/15 #FileName:28-滑块控件 #Description: 通过滑块选择字体大小 import sys from PyQ…

数字的魅力之情有独钟的素数

情有独钟的素数 什么是素数 素数&#xff08;Prime number&#xff09;也称为质数&#xff0c;是指在非0自然数中&#xff0c;除了1与其本身之外不拥有其他因数的自然数。也就是说&#xff0c;素数需要满足两个条件&#xff1a; 大于1的整数&#xff1b;只拥有1和其自身两个…

精读Relational Embedding for Few-Shot Classification (ICCV 2021)

Relational Embedding for Few-Shot Classification (ICCV 2021) 一、摘要 该研究提出了一种针对少样本分类问题的新方法&#xff0c;通过元学习策略来学习“观察什么”和“在哪里关注”。这种方法依赖于两个关键模块&#xff1a;自相关表示&#xff08;SCR&#xff09;和交叉…

统一数据返回格式 及 可能遇到的问题;统一异常处理

统一数据返回格式 统一数据返回格式就像我们寄快递一样&#xff0c;不管你需要寄的东西具体是什么都需要将它打包到统一的快递箱中。 此时我们需要一个“快递箱”用来将返回的数据“装”在里面。这个类是根据业务情况来自行定义的。 Data public class Resp<T> {//200…

[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

【30秒看懂大数据】数据标准

知幽科技是一家专注企业数字/智化&#xff0c;围绕数据价值应用的一站式数智化解决方案的咨询公司&#xff0c;也包括了为企业提供定制化数据培训&#xff0c;力求做企业最好的数智化决策伙伴。 点击上方「蓝字」关注我们 30秒看懂大数据专栏 让您在有限的碎片化时间&#xf…

2024.2.15 寒假训练记录(25)

文章目录 CF 1917C Watering an ArrayCF 1894C Anonymous Informant CF 1917C Watering an Array 题目链接 稍微被卡到的点是&#xff0c;想到要枚举一开始进行多少次操作1的时候&#xff0c;没想到最多枚举2n次&#xff0c;因为n个元素带来的最大贡献就是n了&#xff0c;如果…

深度学习中的鲁棒性和泛化性有什么区别

鲁棒性&#xff08;Robustness&#xff09;和泛化性&#xff08;Generalization&#xff09;是评估模型性能时常用的两个术语&#xff0c;尤其在机器学习和统计建模领域。虽然这两个概念相关&#xff0c;但它们关注的方面有所不同。 鲁棒性 鲁棒性指的是模型在面对输入数据的…

PHP毕业设计图片分享网站76t17

图片分享网站主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xff0c;…

浏览器扩展API 知识介绍

浏览器扩展API允许开发人员创建自定义的浏览器功能&#xff0c;以增强和个性化Web浏览体验。不同的浏览器提供不同的扩展API&#xff0c;但它们通常包括以下几个关键组件&#xff1a; 1. **Manifest文件**&#xff1a; - Manifest文件是扩展的配置文件&#xff0c;它定义了扩…

【C语言】Linux内核bind系统调用代码

一、Linux 4.9内核bind系统调用代码注释 int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) {struct socket *sock; // 定义socket对象的指针struct sockaddr_storage address; // 用于存储从用户空间复制过来的地址int err…

谷歌搜索技巧与 ChatGPT 实用指南:提升你的在线生产力

探索谷歌搜索技巧&#xff0c;提升搜索效率 前言 在搜索三巨头百度、必应、谷歌中&#xff0c;谷歌在搜索精确度以及多语言兼容性方面有明显的优势。其次在国内想要使用谷歌搜索你需要会科学上网&#xff08;这里不说&#xff09;。 一.排除干扰内容&#xff08;广告&#xff…

【实战】一、Jest 前端自动化测试框架基础入门(四) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(四)

文章目录 一、Jest 前端自动化测试框架基础入门10.Jest 中的 Mock&#xff08;1&#xff09;toBeCalled&#xff08;2&#xff09;func.mock&#xff08;3&#xff09;mockReturnValue & mockReturnValueOnce 学习内容来源&#xff1a;Jest入门到TDD/BDD双实战_前端要学的测…

算法训练day29Leetcode491递增子序列46全排列47全排列Ⅱ

491 递增子序列 题目描述 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一…

【自我介绍】计算机软件工程人工智能研究生复试资料整理

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 自我介绍 英文 自我介绍 英文 第一段: Good afternoon, dear professors, thank you for the chance to introduce myself. My name is Yan Zhen Xing, and I a…