32 - II. 从上到下打印二叉树 II
comments: true
difficulty: 简单
edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9832%20-%20II.%20%E4%BB%8E%E4%B8%8A%E5%88%B0%E4%B8%8B%E6%89%93%E5%8D%B0%E4%BA%8C%E5%8F%89%E6%A0%91%20II/README.md
面试题 32 - II. 从上到下打印二叉树 II
题目描述
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3/ \9 20/ \15 7
返回其层次遍历结果:
[[3],[9,20],[15,7] ]
提示:
节点总数 <= 1000
注意:本题与主站 102 题相同:https://leetcode.cn/problems/binary-tree-level-order-traversal/
解法
方法一:BFS
我们可以使用 BFS 的方法来解决这道题。首先将根节点入队,然后不断地进行以下操作,直到队列为空:
- 遍历当前队列中的所有节点,将它们的值存储到一个临时数组 t t t 中,然后将它们的孩子节点入队。
- 将临时数组 t t t 存储到答案数组中。
最后返回答案数组即可。
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)。其中 n n n 是二叉树的节点个数。
Python3
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = Noneclass Solution:def levelOrder(self, root: TreeNode) -> List[List[int]]:ans = []if root is None:return ansq = deque([root])while q:t = [] #保存单层节点for _ in range(len(q)):node = q.popleft()t.append(node.val)if node.left:q.append(node.left)if node.right:q.append(node.right)ans.append(t)return ans
Java
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> ans = new ArrayList<>();if (root == null) {return ans;}Deque<TreeNode> q = new ArrayDeque<>();q.offer(root);while (!q.isEmpty()) {List<Integer> t = new ArrayList<>();for (int n = q.size(); n > 0; --n) {TreeNode node = q.poll();t.add(node.val);if (node.left != null) {q.offer(node.left);}if (node.right != null) {q.offer(node.right);}}ans.add(t);}return ans;}
}
C++
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> ans;if (!root) return ans;queue<TreeNode*> q{{root}};while (!q.empty()) {vector<int> t;for (int n = q.size(); n; --n) {auto node = q.front();q.pop();t.push_back(node->val);if (node->left) q.push(node->left);if (node->right) q.push(node->right);}ans.push_back(t);}return ans;}
};
Go
/*** Definition for a binary tree node.* type TreeNode struct {* Val int* Left *TreeNode* Right *TreeNode* }*/
func levelOrder(root *TreeNode) (ans [][]int) {if root == nil {return}q := []*TreeNode{root}for len(q) > 0 {t := []int{}for n := len(q); n > 0; n-- {node := q[0]q = q[1:]t = append(t, node.Val)if node.Left != nil {q = append(q, node.Left)}if node.Right != nil {q = append(q, node.Right)}}ans = append(ans, t)}return
}
TypeScript
/*** Definition for a binary tree node.* class TreeNode {* val: number* left: TreeNode | null* right: TreeNode | null* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }* }*/function levelOrder(root: TreeNode | null): number[][] {const res = [];if (root == null) {return res;}const queue = [root];while (queue.length !== 0) {const n = queue.length;const tmp = new Array(n);for (let i = 0; i < n; i++) {const { val, left, right } = queue.shift();tmp[i] = val;left && queue.push(left);right && queue.push(right);}res.push(tmp);}return res;
}
Rust
// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
// pub val: i32,
// pub left: Option<Rc<RefCell<TreeNode>>>,
// pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
// #[inline]
// pub fn new(val: i32) -> Self {
// TreeNode {
// val,
// left: None,
// right: None
// }
// }
// }
use std::cell::RefCell;
use std::collections::VecDeque;
use std::rc::Rc;
impl Solution {pub fn level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<Vec<i32>> {let mut res = Vec::new();if root.is_none() {return res;}let mut queue = VecDeque::new();queue.push_back(root);while !queue.is_empty() {let n = queue.len();let mut vals = Vec::with_capacity(n);for _ in 0..n {let mut node = queue.pop_front().unwrap();let mut node = node.as_mut().unwrap().borrow_mut();vals.push(node.val);if node.left.is_some() {queue.push_back(node.left.take());}if node.right.is_some() {queue.push_back(node.right.take());}}res.push(vals);}res}
}
JavaScript
/*** Definition for a binary tree node.* function TreeNode(val) {* this.val = val;* this.left = this.right = null;* }*/
/*** @param {TreeNode} root* @return {number[][]}*/
var levelOrder = function (root) {let ans = [];if (!root) {return ans;}let q = [root];while (q.length) {let t = [];for (let n = q.length; n; --n) {const { val, left, right } = q.shift();t.push(val);left && q.push(left);right && q.push(right);}ans.push(t);}return ans;
};
C#
/*** Definition for a binary tree node.* public class TreeNode {* public int val;* public TreeNode left;* public TreeNode right;* public TreeNode(int x) { val = x; }* }*/
public class Solution {public IList<IList<int>> LevelOrder(TreeNode root) {if (root == null) {return new List<IList<int>>();}Queue<TreeNode> q = new Queue<TreeNode>();q.Enqueue(root);List<IList<int>> ans = new List<IList<int>>();while (q.Count != 0) {List<int> tmp = new List<int>();int x = q.Count;for (int i = 0; i < x; i++) {TreeNode node = q.Dequeue();tmp.Add(node.val);if (node.left != null) {q.Enqueue(node.left);}if (node.right != null) {q.Enqueue(node.right);}}ans.Add(tmp);}return ans;}
}
相关文章:
32 - II. 从上到下打印二叉树 II
comments: true difficulty: 简单 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9832%20-%20II.%20%E4%BB%8E%E4%B8%8A%E5%88%B0%E4%B8%8B%E6%89%93%E5%8D%B0%E4%BA%8C%E5%8F%89%E6%A0%91%20II/README.md 面试题 32 - II. 从上到下打…...
總結熱力學_3
參考: 陈曦<<热力学讲义>>http://ithatron.phys.tsinghua.edu.cn/downloads/thermodynamics.pdf 4 热力学量的测量 4.3 主温度计 常用的气体温度计有等体积气体温度计、声学气体温度计和介电常数气体温度计。很多气体在水的三相点附近都接近理想气体。但真正的理…...
TypeScript学习笔记1---认识ts与js的异同、ts的所有数据类型详解
前言:去年做过几个vue3js的项目,当时考虑到时间问题,js更加熟悉,学习成本低一点,所以只去了解了vue3。最近这段时间补了一下ts的知识点,现今终于有空来码文章了,做个学习总结,方便以…...
华为数通方向HCIP-DataCom H12-821题库(更新单选真题:1-10)
第1题 1、下面是一台路由器的部分配置,关于该配置描述正确的是? [HUAWEllact number 2001 [HUAWEl-acl-basic-2001]rule 0 permit source 1.1.1.1 0 [HUAWEl-acl-basic-2001]rule 1 deny source 1.1.1.0 0 [HUAWEl-acl-basic-2001]rule...
【车载开发系列】单片机烧写的文件
【车载开发系列】单片机烧写的文件 【车载开发系列】单片机烧写的文件 【车载开发系列】单片机烧写的文件一. 什么是bin二. 什么是Hex三. 什么是Motorola S-record(S19)四. ELF格式五. Bin与Hex文件的比对六. 单片机烧写文件的本质 一. 什么是bin bin是…...
pyqt 用lamada关联信号 传递参数 循环
在PyQt中,使用lambda函数来关联信号并传递参数是一个常见的做法,尤其是在需要为不同的对象实例关联不同的槽函数参数时。但是,需要注意的是,直接使用lambda可能会导致一些不易察觉的错误,尤其是当它在循环中使用时。这…...
adb命令
adbclient adbserver adbd 三者之间的关系 adbclient, adbserver, 和 adbd 是 Android Debug Bridge (ADB) 组件中的三个主要组成部分。它们各自扮演着不同的角色,共同协作来实现设备调试和管理的功能。下面我将详细介绍这三个组件之间的关系: adbd (A…...
Spring Boot项目热部署
Spring Boot项目热部署是什么 Spring Boot项目热部署是一种开发时的优化技术,可以使开发人员在修改代码后不需要重新启动应用程序即可实时看到修改的效果。在传统的开发模式中,每次修改代码后都需要重新编译、打包和部署应用程序,这样会浪费大…...
Chat App 项目之解析(八)
Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读340次,点赞7次,收藏3次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了…...
CAAC无人机飞行执照:学习内容与考试流程详解
CAAC无人机飞行执照的学习内容与考试流程是无人机爱好者及从业者必须了解的重要信息。以下是对这两方面的详细解析: 学习内容 CAAC无人机飞行执照的学习内容涵盖了多个方面,以确保学员能够全面掌握无人机飞行和应用的技能。主要学习内容包括:…...
苹果手机怎么连接蓝牙耳机?3个方案,3秒连接
在快节奏的现代生活中,无线蓝牙耳机因其便捷性和自由度成为了许多人的首选。那么,苹果手机怎么连接蓝牙耳机呢?本文将为您介绍3种快速连接苹果设备与蓝牙耳机的方案,让您在享受音乐、通话或观看视频时,不再受线缆束缚&…...
CAD图纸加密软件有哪些?10款超级好用的CAD图纸加密软件推荐
在数字化设计日益普及的今天,CAD图纸作为企业的核心资产,其安全性变得尤为重要。为了防止图纸被非法获取、篡改或泄露,使用专业的CAD图纸加密软件成为了许多企业和设计师的首选。本文将为您推荐10款在2024年表现突出的CAD图纸加密软件&#x…...
【html+css 绚丽Loading】000011 三元轮回珠
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕…...
算法学习018 求最短路径 c++算法学习 中小学算法思维学习 比赛算法题解 信奥算法解析
目录 C求最短路径 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 六、推荐资料 C求最短路径 一、题目要求 1、编程实现 给定n个顶点,每个顶点到其它顶点之间有若干条路,选择每条路需要消耗一定…...
vue-element-admin——<keep-alive>不符合预期缓存的原因
vue-element-admin——<keep-alive>不符合预期缓存的原因 本文章,以现在中后台开发用的非常多的开源项目vue-element-admin为案例。首先,列出官方文档与缓存<keep-alive>相关的链接(请认真阅读,出现缓存<keep-ali…...
基于ElementPlus的分页表格组件ReTable
分页表格ReTable 组件实现基于 Vue3 Element Plus Typescript,同时引用 vueUse lodash-es tailwindCss (不影响功能,可忽略) 基于ElTable和ElPagination组件封装的分页表格,支持本地分页以及远程请求两种方式。本地数据分页自带全量数据的…...
力扣题/图论/课程表
课程表 力扣原题 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课…...
SQL进阶技巧:基于指定规则的缺失值填充问题
目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 有如下breed表。表中有breed、dt、value字段,value值中存在大量的NULL值,NULL值为缺省值,缺省值需要按照一定规则进行填充。 规则如下: 用表中value值紧邻且非空的两行均值进行填充。 1 数据准备 with bre…...
【气象百科】光伏自动气象站的功能优势
随着全球对可再生能源需求的日益增长,光伏发电作为清洁、可再生的能源形式,正逐步成为推动能源转型的重要力量。而光伏自动气象站,作为光伏电站智能化管理的重要组成部分,其独特的功能优势在提升光伏系统效率、优化运维策略、增强…...
嵌入式AI快速入门课程-K510篇 (第二篇 Ubuntu的基础操作)
第二篇 Ubuntu的基础操作 文章目录 第二篇 Ubuntu的基础操作1. 安装 VMware 运行 Ubuntu1.1 安装 VMware 1.2 使用VMware打开Ubuntu1.2.1 下载、解压Ubuntu映像文件1.2.1 在BIOS上启动虚拟化(virtualization)1.1.1 使用VMware运行Ubuntu 2.第1章 Ubuntu操作入门1.1 Ubuntu下打开…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
