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

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

文章目录

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

题目链接

LeetCode107、二叉树的层序遍历II

题目描述

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1

在这里插入图片描述

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

示例 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次这个步骤是必要的。

本题沿用了LeetCode102、二叉树的层序遍历的大体框架,但最后要求返回的结果是自底向上的层序遍历,只需要返回ans数组的反转即可。即

return ans[::-1] 

代码

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[::-1]      # 退出while循环,返回答案列表

Java

class Solution {public List<List<Integer>> levelOrderBottom(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(0, subList);}return ans;}
}

C++

class Solution {
public:vector<vector<int>> levelOrderBottom(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.insert(ans.begin(), 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/683483.shtml

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

相关文章

寒假学习记录13:JS对象

目录 对象转数组 对象双值转数组 Object.entries() &#xff08;转为二维数组&#xff09;&#xff08;属性的值和键&#xff09; 对象右值转数组 Object.values() &#xff08;属性的值&#xff09; 对象左值转数组 Object.keys() (属性的键) 对象左值转…

计算机视觉基础:获取图像的ROI

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区域&#xff08;Region of Interest&#xff0c;ROI&#xff09;。在设定感兴趣区域ROI后&#xff0c;就可以对该区域进行整体操作。 Python实现代码如下&#xff1a; # -…

怎样学习Windows下命令行编写

第一&#xff1a;Windows下命令行指的是cmd和powershell命令行编写 第二&#xff1a;必须要用好help或/?命令&#xff0c;这个命令是最基本的也是最常用的命令列表和语法查看命令 第三&#xff1a;cmd命令使用help查看命令列表或“一串带参数的命令 /?"&#xff08;不…

[职场] 花园管家是做什么的 #笔记#学习方法

花园管家是做什么的 一、工作内容职责&#xff1a; 1.管理花园内的活动和工作&#xff0c;协调各方资源&#xff0c;确保活动的顺利进行&#xff1b; 2.提供优质的客户服务和接待工作&#xff0c;解决客户问题&#xff0c;处理投诉&#xff0c;提高客户满意度&#xff1b; …

(03)Hive的相关概念——分区表、分桶表

目录 一、Hive分区表 1.1 分区表的概念 1.2 分区表的创建 1.3 分区表数据加载及查询 1.3.1 静态分区 1.3.2 动态分区 1.4 分区表的本质及使用 1.5 分区表的注意事项 1.6 多重分区表 二、Hive分桶表 2.1 分桶表的概念 2.2 分桶表的创建 2.3 分桶表的数据加载 2.4 …

C++ 基础算法 前缀和

输入一个长度为 n 的整数序列。 接下来再输入 m 个询问&#xff0c;每个询问输入一对 l,r 。 对于每个询问&#xff0c;输出原序列中从第 l 个数到第 r 个数的和。 输入格式 第一行包含两个整数 n 和 m 。 第二行包含 n 个整数&#xff0c;表示整数数列。 接下来 m 行&…

操作系统(14)----文件系统的结构

目录 一.文件系统的层次结构 1.用户接口&#xff1a; 2.文件目录系统&#xff1a; 3.存取控制模块&#xff1a; 4.逻辑文件系统与文件信息缓冲区&#xff1a; 5.物理文件系统&#xff1a; 二.文件系统的全局结构 1.文件系统在外存中的结构 &#xff08;1&#xff09;物…

Mermaid绘制UML图教程

Mermaid 是一种轻量级的图形描述语言&#xff0c;用于绘制流程图、时序图、甘特图等各种图表。它采用简单的文本语法&#xff0c;使得用户能够快速绘制各种复杂图表&#xff0c;而无需深入学习图形绘制工具。 一、安装Mermaid Mermaid 可以在浏览器中直接使用&#xff0c;也可…

剑指offer——数值的整数次方

目录 1. 题目描述2. 一般思路2.1 有问题的思路2.2 全面但不高效的思路2.3 面试小提示 3. 全面又高效的思路 1. 题目描述 题目:实现函数 double Power(double base,int exponent)&#xff0c;求base 的exponent 次方。不得使用库函数&#xff0c;同时不需要考虑大数问题 2. 一般…

第13讲创建图文投票

创建图文投票实现 图文投票和文字投票基本一样&#xff0c;就是在投票选项里面&#xff0c;多了一个选项图片&#xff1b;、 <view class"option_item" v-for"(item,index) in options" :key"item.id"><view class"option_input&…

AIGC盛行,带你轻松调用开发

文章目录 前言一、&#x1f4d6;AIGC简介二、&#x1f4e3;开通体验开通模型获取API-KEY 三、&#x1f4dd;基于java实现调用1.设置API-KEY2.体验大语言模型多轮对话演示补充流式输出 3.体验通义千问VL使用官方提供照片本地文件多轮对话流式输出 总结 前言 本篇文章基于java和…

C++的进阶泛型编程学习(1):函数模板的基本概念和机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、模板1.1 模板的概念1.1.1 形象的解释&#xff1a;模板就是通用的模具&#xff0c;目的是提高通用性1.1.1 模板的特点&#xff1a;1.1.2 综述模板的作用 1.2…

揭秘Angular世界的奥秘:全面提升你的前端开发技能!

介绍&#xff1a;Angular是一个由Google维护的开源JavaScript框架&#xff0c;专为构建Web应用程序而设计&#xff0c;特别适合开发大型单页应用&#xff08;SPA&#xff09;。以下是对Angular的详细介绍&#xff1a; 技术栈&#xff1a;Angular使用HTML作为模板语言&#xff0…

作业2.15

1.head head 文件名 默认回显文件的前十行 head -n 文件名 回显文件的前n行 2.tail tail 文件名 默认回显文件的后10行 tail -n 文件名 回显文件的后n行 3. | 管道符 指令1 | 指令2 | 指令3 | 管道符左侧指令的输出用作管道符右侧指令的输入 4.file 查看文件的信息 file 文件…

怎么查看python的安装路径

要查看Python的安装路径&#xff0c;你可以使用以下几种方法&#xff1a; 方法1&#xff1a;使用命令行&#xff08;适用于所有操作系统&#xff09; 打开命令行界面&#xff08;在Windows上是命令提示符或PowerShell&#xff0c;在macOS和Linux上是终端&#xff09;。输入以…

耳机壳UV树脂制作私模定制耳塞需要注意什么问题?

制作私模定制耳塞需要注意以下问题&#xff1a; 耳模制作&#xff1a;获取准确的耳模是制作私模定制耳塞的关键步骤。需要使用合适的材料和方法&#xff0c;确保耳模的准确性和稳定性。材料选择&#xff1a;选择合适的UV树脂和其它相关材料&#xff0c;确保它们的质量和性能符…

2024.2.15每日一题

LeetCode 二叉树的层序遍历 II 107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&am…

滑动窗口(三)

Leetcode30. 串联所有单词的子串 题目 Leetcode30. 串联所有单词的子串 解法(滑动窗口) 利用substr函数截取出来的s中截取出一段一段的单词&#xff0c;然后和words中比较是否相等。 hash1<string, int>用来存储words中单词出现的次数left right指针每次移动的步数为wo…

c++stoi函数解释

别问我为什么不继续发恶魔轮盘了&#xff0c;我的代码被我的堂弟给删了&#xff0c;全部变成小猪佩奇动画片了 std::stoi是C标准库中的一个函数&#xff0c;用于将字符串转换为整数类型。它的全名是std::string to int&#xff0c;所以stoi就是string to int的缩写。 它的函数…

【图论经典题目讲解】CF715B - Complete The Graph

C F 715 B − C o m p l e t e T h e G r a p h \mathrm{CF715B - Complete\ The\ Graph} CF715B−Complete The Graph D e s c r i p t i o n \mathrm{Description} Description 给定一张 n n n 个点&#xff0c; m m m 条边的无向图&#xff0c;点的编号为 0 ∼ n − 1 0\…