【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.rhkb.cn/news/257623.html

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

相关文章

Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)

文章目录 题目链接题意题解代码 题目链接 C. Digital Logarithm 题意 给两个长度位 n n n的数组 a a a、 b b b&#xff0c;一个操作 f f f 定义操作 f f f为&#xff0c; a [ i ] f ( a [ i ] ) a [ i ] a[i]f(a[i])a[i] a[i]f(a[i])a[i]的位数 求最少多少次操作可以使 …

蓝桥杯嵌入式第10届真题(完成) STM32G431

蓝桥杯嵌入式第10届真题(完成) STM32G431 题目 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body********************************…

机器学习:卷积介绍及代码实现卷积操作

传统卷积运算是将卷积核以滑动窗口的方式在输入图上滑动&#xff0c;当前窗口内对应元素相乘然后求和得到结果&#xff0c;一个窗口一个结果。相乘然后求和恰好也是向量内积的计算方式&#xff0c;所以可以将每个窗口内的元素拉成向量&#xff0c;通过向量内积进行运算&#xf…

STM32控制JQ8400语音播报模块

时间记录&#xff1a;2024/2/7 一、JQ8400引脚介绍 标示说明ONE LINE一线操作引脚BUSY忙信号引脚&#xff0c;正在播放语音时输出高电平RX串口两线操作接收引脚TX串口两线操作发送引脚GND电源地引脚DC-5V电源引脚&#xff0c;3.3-5VDAC-RDAC输出右声道引脚DAC-LDAC输出左声道…

爬虫——ajax和selenuim总结

为什么要写这个博客呢&#xff0c;这个代码前面其实都有&#xff0c;就是结束了。明天搞个qq登录&#xff0c;这个就结束了。 当然也会更新小说爬取&#xff0c;和百度翻译&#xff0c;百度小姐姐的爬取&#xff0c;的对比爬取。总结嘛&#xff01;&#xff01;&#xff01;加…

【运维测试】测试理论+工具总结笔记第1篇:测试理论的主要内容(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论测试理论测试工具相关知识。Python测试理论的主要内容&#xff0c;掌握软件测试的基本流程&#xff0c;知道软件测试的V和W模型的优缺点&#xff0c;掌握测试用例设计的要素&#xff0c;掌握等价类划分法、边界值法、因…

可视化工具:将多种数据格式转化为交互式图形展示的利器

引言 在数据驱动的时代&#xff0c;数据的分析和理解对于决策过程至关重要。然而&#xff0c;不同的数据格式和结构使得数据的解读变得复杂和困难。为了解决这个问题&#xff0c;一种强大的可视化工具应运而生。这个工具具有将多种数据格式&#xff08;包括JSON、YAML、XML、C…

专业140+总分420+东北大学841通信专业基础考研经验东大电子信息与通信工程,真题,大纲,参考书。

今年考研顺利上岸&#xff0c;被东北大学通信工程录取&#xff0c;其中专业课841通信专业基础140&#xff0c;数二140&#xff0c;总分420&#xff0c;整体每门课都还是比较均衡&#xff0c;刚开始考研前也和大家一样&#xff0c;焦虑&#xff0c;紧张&#xff0c;面对考研怕失…

关于npmlink的问题

深入浅出关于Npm linl的问题 关键词&#xff1a; vue3报错 Uncaught TypeError: Cannot read properties of null (reading ‘isCE‘) at renderSlot npm link 无法实现热更新 我的开发环境是 “vue”: “^3.2.13” 今天在使用 rollup搭建组件库的时候我发现我的组件库不能…

模拟电子技术——基本放大电路

文章目录 前言一、三极管输入输出特性三极管放大作用三极管电流放大关系三极管的特性曲线 二、基本放大电路-电路结构与工作原理基本放大电路的构成基本放大电路放大原理三种基本放大电路比较 三、基本放大电路静态工作点什么是静态工作点&#xff1f;静态工作点的作用估算法分…

MySQL-----函数篇

目录 ▶ 字符串函数 ▶ 数值函数 ▶ 日期函数 ▶ 流程函数 ▶ 简介 函数是指一段可以直接被另一段程序调用的程序或代码。 ▶ 字符串函数 函数描述实例ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。 返回 CustomerName 字段第一个字母的 ASCII 码&#xff1a; S…

FastJson、Jackson使用AOP切面进行日志打印异常

FastJson、Jackson使用AOP切面进行日志打印异常 一、概述 1、问题详情 使用FastJson、Jackson进行日志打印时分别包如下错误&#xff1a; 源码&#xff1a; //fastjon log.info("\nRequest Info :{} \n"&#xff0c; JSON.toJSONString(requestInfo)); //jackson …

无人机概述及系统组成,无人机系统的构成

无人机的定义 无人驾驶航空器&#xff0c;是一架由遥控站管理&#xff08;包括远程操纵或自主飞行&#xff09;的航空器&#xff0c;也称遥控驾驶航空器&#xff0c;以下简称无人机。 无人机系统的定义 无人机系统&#xff0c;也称无人驾驶航空器系统&#xff0c;是指一架无人…

【MySQL/Redis】如何实现缓存一致

目录 不实用的方案 1. 先写 MySQL , 再写 Redis 2. 先写 Redis &#xff0c; 再写MySQL 3. 先删 Redis&#xff0c;再写 MySQL 实用的方案 1. 先删 Redis&#xff0c;再写 MySQL, 再删 Redis 2. 先写 MySQL , 再删 Redis 3. 先写MySQL&#xff0c;通过BinLog&#xff0…

anomalib1.0学习纪实

回顾&#xff1a;细分、纵深、高端、上游、积累、极致。 回顾&#xff1a;产品化&#xff0c;资本化&#xff0c;规模化&#xff0c;大干快上&#xff0c;小农思维必死无疑。 春节在深圳新地中央&#xff0c;学习anomalib1.0。 一、安装&#xff1a; 1、常规安装 采用的是…

【MySQL】外键约束的删除和更新总结

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-7niJLSFaPo0wso60 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

CentOS7.9+Kubernetes1.29.2+Docker25.0.3高可用集群二进制部署

CentOS7.9Kubernetes1.29.2Docker25.0.3高可用集群二进制部署 Kubernetes高可用集群&#xff08;Kubernetes1.29.2Docker25.0.3&#xff09;二进制部署二进制软件部署flannel v0.22.3网络&#xff0c;使用的etcd是版本3&#xff0c;与之前使用版本2不同。查看官方文档进行了解…

小白学习Halcon100例:如何利用动态阈值分割图像进行PCB印刷缺陷检测?

文章目录 *读入图片*关闭所有窗口*获取图片尺寸*根据图片尺寸打开一个窗口*在窗口中显示图片* 缺陷检测开始 ...*1.开运算 使用选定的遮罩执行灰度值开运算。*2.闭运算 使用选定的遮罩执行灰度值关闭运算*3.动态阈值分割 使用局部阈值分割图像显示结果*显示原图*设置颜色为红色…

一文搞懂“什么是双亲委派”

文章目录 双亲委派介绍类加载器介绍类加载流程验证自定义类加载器为什么要设计这种机制 提前声明&#xff1a;以下介绍都是基于jdk9之前版本的双亲委派机制&#xff0c;jdk9及之后版本双亲委派会有变化&#xff0c;不在本篇介绍。 双亲委派介绍 双亲委派机制&#xff08;Pare…

前端秘法进阶篇之事件循环

目录 一.浏览器的进程模型 1.进程 2.线程 二.浏览器的进程和线程 1. 浏览器进程 2. 网络进程 3. 渲染进程 三.渲染主线程 四.异步 五.优先级 1. 延时队列&#xff1a; 2.交互队列&#xff1a; 3.微队列&#xff1a; 六.JS 的事件循环 附加:JS 中的计时器能做到精…