32 - I. 从上到下打印二叉树

news/2024/9/14 9:33:58/ 标签: 算法

comments: true
difficulty: 中等
edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9832%20-%20I.%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/README.md

面试题 32 - I. 从上到下打印二叉树

题目描述

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

 

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3/ \9  20/  \15   7

返回:

[3,9,20,15,7]

 

提示:

  1. 节点总数 <= 1000

解法

方法一:BFS

我们可以通过 BFS 遍历二叉树,将每一层的节点值存入数组中,最后返回数组即可。

时间复杂度 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[int]:ans = []if root is None:return ansq = deque([root])while q:#保证层序下去for _ in range(len(q)):node = q.popleft()ans.append(node.val)if node.left:q.append(node.left)if node.right:q.append(node.right)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 int[] levelOrder(TreeNode root) {if (root == null) {return new int[] {};}Deque<TreeNode> q = new ArrayDeque<>();q.offer(root);List<Integer> res = new ArrayList<>();while (!q.isEmpty()) {for (int n = q.size(); n > 0; --n) {TreeNode node = q.poll();res.add(node.val);if (node.left != null) {q.offer(node.left);}if (node.right != null) {q.offer(node.right);}}}int[] ans = new int[res.size()];for (int i = 0; i < ans.length; ++i) {ans[i] = res.get(i);}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<int> levelOrder(TreeNode* root) {if (!root) {return {};}vector<int> ans;queue<TreeNode*> q{{root}};while (!q.empty()) {for (int n = q.size(); n; --n) {auto node = q.front();q.pop();ans.push_back(node->val);if (node->left) {q.push(node->left);}if (node->right) {q.push(node->right);}}}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 {for n := len(q); n > 0; n-- {node := q[0]q = q[1:]ans = append(ans, node.Val)if node.Left != nil {q = append(q, node.Left)}if node.Right != nil {q = append(q, node.Right)}}}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 ans: number[] = [];if (!root) {return ans;}const q: TreeNode[] = [root];while (q.length) {const t: TreeNode[] = [];for (const { val, left, right } of q) {ans.push(val);left && t.push(left);right && t.push(right);}q.splice(0, q.length, ...t);}return ans;
}
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<i32> {let mut ans = Vec::new();let mut q = VecDeque::new();if let Some(node) = root {q.push_back(node);}while let Some(node) = q.pop_front() {let mut node = node.borrow_mut();ans.push(node.val);if let Some(l) = node.left.take() {q.push_back(l);}if let Some(r) = node.right.take() {q.push_back(r);}}ans}
}
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) {const ans = [];if (!root) {return ans;}const q = [root];while (q.length) {const t = [];for (const { val, left, right } of q) {ans.push(val);left && t.push(left);right && t.push(right);}q.splice(0, q.length, ...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 int[] LevelOrder(TreeNode root) {if (root == null) {return new int[]{};}Queue<TreeNode> q = new Queue<TreeNode>();q.Enqueue(root);List<int> ans = new List<int>();while (q.Count != 0) {int x = q.Count;for (int i = 0; i < x; i++) {TreeNode node = q.Dequeue();ans.Add(node.val);if (node.left != null) {q.Enqueue(node.left);}if (node.right != null) {q.Enqueue(node.right);}}}return ans.ToArray();}
}
Swift
/* public class TreeNode {
*     var val: Int
*     var left: TreeNode?
*     var right: TreeNode?
*     init(_ val: Int) {
*         self.val = val
*         self.left = nil
*         self.right = nil
*     }
* }
*/class Solution {func levelOrder(_ root: TreeNode?) -> [Int] {guard let root = root else {return []}var queue: [TreeNode] = [root]var result: [Int] = []while !queue.isEmpty {let node = queue.removeFirst()result.append(node.val)if let left = node.left {queue.append(left)}if let right = node.right {queue.append(right)}}return result}
}

http://www.ppmy.cn/news/1515947.html

相关文章

基于数据挖掘的心力衰竭疾病风险评估系统

B站视频及代码下载&#xff1a;基于数据挖掘的心力衰竭疾病风险评估系统_哔哩哔哩_bilibili 1. 项目简介 心力衰竭是一种常见的心脏疾病&#xff0c;它严重影响患者的生活质量和预期寿命。早期识别和干预对于改善患者的预后至关重要。近年来&#xff0c;随着大数据技术和机器学…

C语言小项目源码大全(60套)

C语言小项目源码大全60套 目录源码文件 目录 纯c语言迷宫源码.exe . c语言五子棋源码.exe c语言24点游戏源码.exe c语言万年历源码.exe c语言别踩白块儿(双人版)源码.exe c语言奔跑的火柴人游戏源码.exe c语言吃逗游戏源码.exe C语言超市管理系统.exe c语言对对碰游戏…

ansible:远程自动化运维

ansible是基于python开发的配置管理和应用部署工具。 也是自动化运维的重要工具。 可以批量配置&#xff0c;部署&#xff0c;管理上千台主机。 只需要在一台主机配置ansible就可以完成其他主机的操作。 操作模式&#xff1a; 1、模块化操作&#xff1a;命令行执行 2、pl…

搭建 Vue 项目博客

一、引言 Vue.js 是一个渐进式的 JavaScript 框架&#xff0c;非常适合用于构建用户界面。本篇博客将详细介绍如何使用 Vue CLI 搭建一个简单的 Vue 项目博客。 二、安装 Node.js 和 npm 在开始之前&#xff0c;请确保你的计算机上已经安装了 Node.js 和 npm。如果没有&…

嵌入式UI开发-lvgl+wsl2+vscode系列:11、SSD202移植运行评估demo程序

一、前言 接下来我们根据开发板的LVGL指南移植lvgl的demo程序到开发板上&#xff0c;以及将一个评估的项目移植到开发板上&#xff0c;你将会发现移植lvgl到ssd2xx的板子上似乎很简单&#xff0c;但通过评估程序你将更加方便了解lvgl是否可以满足你的开发需求&#xff0c;除了…

电脑U口管理软件分享|U口管理软件哪个好?

电脑U口&#xff08;即USB端口&#xff09;管理软件是保护电脑安全、防止数据泄露和恶意软件入侵的重要工具。 在选择U口管理软件时&#xff0c;需要考虑其功能、易用性、安全性以及是否满足个人或企业的具体需求。以下是一些值得推荐的电脑U口管理软件及其特点&#xff1a; 1…

SpringBoot整合定时任务

定时任务是企业级开发中必不可少的组成部分&#xff0c;诸如长周期业务数据的计算&#xff0c;例如年度报表&#xff0c;诸如系统脏数据的处理&#xff0c;再比如系统性能监控报告&#xff0c;还有抢购类活动的商品上架&#xff0c;这些都离不开定时任务。本节将介绍两种不同的…

Obsidian Publish的开源替代品Markopolis

什么是 Markopolis &#xff1f; Markopolis 是一款旨在提供 Markdown 文件的 Web 应用和 API 服务器。它允许您以网站形式共享 Markdown 笔记&#xff0c;并使用 API 与 Markdown 文件交互和操作它们。类似于 Obsidian Publish&#xff0c;但又不会被锁定在 Obsidian 生态系统…

微分方程(Blanchard Differential Equations 4th)中文版Section4.2

正弦强迫系统 在本节中,我们研究的是外力为正弦或余弦函数的强迫谐振子方程: d 2 y d t 2 + p d y d t + q y = g ( t ) , \frac{d^2 y}{dt^2} + p \frac{dy}{dt} + qy = g(t), dt2d2y​+pdtdy​+qy=g(t), 其中 g ( t ) g(t) g(t) 是一个正弦或余弦函数。这种类型的外部强…

qt creator自动运行单元测试

qt creator自动运行单元测试 工具-选项-Testing-General&#xff0c;找到Automatically run&#xff0c;选项卡选择All。

SwiftUI 革命:打造未来派用户界面的艺术

标题&#xff1a;SwiftUI 革命&#xff1a;打造未来派用户界面的艺术 在当今快速发展的移动应用领域&#xff0c;用户界面(UI)的设计和实现已经成为开发者们关注的焦点。SwiftUI&#xff0c;作为苹果公司推出的现代UI框架&#xff0c;以其声明式编程范式、强大的数据绑定能力和…

【C#】【EXCEL】BumblebeeComponentsAnalysisGH_Ex_Ana_CondUnique.cs

这段代码定义了一个名为 GH_Ex_Ana_CondUnique 的 Grasshopper 组件。以下是该组件的功能和介绍&#xff1a; 功能介绍&#xff1a; 这个组件是用于在 Excel 范围内添加基于唯一值的条件格式。它允许用户高亮显示工作表中的唯一值或非唯一值。 主要特点&#xff1a; 条件格式…

稳石机器人 | 工业级AMR S1200L,专为多样化需求设计,柔性拓展更易用

近日&#xff0c;稳石机器人重磅推出基于新品控制器ROC1000的全新移动机器人AMR S1200L&#xff0c;专为满足生产制造和仓储物流的多样化需求而设计&#xff0c;无需改造现场&#xff0c;最快可在1周内完成部署。 重载型AMR-S1200L设计注重实用性和灵活性&#xff0c;可在室内…

解决执行npm run dev报错node: --openssl-legacy-provider is not allowed in NODE_OPTIONS

问题&#xff1a; 最近下载了一个开源系统&#xff0c;执行npm install很顺利&#xff0c;以为大功告成&#xff0c;结果运行npm run dev时报错node: --openssl-legacy-provider is not allowed in NODE_OPTIONS 解决方法&#xff1a; 应用程序配置&#xff08;package.json&a…

Ansible初识

ansible初识 Ansible是一种自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它基于Python语言开发&#xff0c;使用SSH协议进行通信&#xff0c;并且不需要在被管理的主机上安装任何客户端。Ansible使用简单的YAML语言来描述任务和配置&#xff0c;使得操作简…

测试用例的设计

*涉及概念来源于《软件测试的艺术》 目录 一、为什么要设计测试用例&#xff1f; 二、黑盒测试与白盒测试介绍 三、测试用例常见设计方法 1.黑盒测试(功能测试) 2.白盒测试(结构测试) 四、测试策略 五、测试用例怎么写 一、为什么要设计测试用例&#xff1f; 由于时间…

一本读懂数据库发展史的书

数据库及其存储技术&#xff0c;一直以来都是基础软件的主力。数据库系统的操作接口标准&#xff0c;也是应用型软件的重要接口&#xff0c;关系重大。 作为最“有感”的系统软件&#xff0c;数据库的历史悠久、品类繁多、创新活跃。 对数据库历史发展的介绍&#xff0c;有利…

前端知识点

1.常见文本标签 2.属性 3.区块 4.表单 如果那个性别只能是单选的话要加上name属性 css 相邻选择器就是跟在被选中的里面的所有 js基本语法 js函数&#xff1a;就跟C语言差不多啊 改文本 引入js

【C#】【EXCEL】Bumblebee/Classes/ExColumn.cs

文章目录 Bumblebee/Classes/ExColumn.csFlow diagramDescriptionCode Bumblebee/Classes/ExColumn.cs Flow diagram #mermaid-svg-6WUm4r0wDJG9uelI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6WUm4r0wDJG9ue…

[Algorithm][综合训练][对称之美][经此一役小红所向无敌][连续子数组最大和]详细讲解

目录 1.对称之美1.题目链接2.算法原理详解 && 代码实现 2.经此一役小红所向无敌1.题目链接2.算法原理详解 && 代码实现 3.连续子数组最大和1.题目链接2.算法原理详解 && 代码实现 1.对称之美 1.题目链接 对称之美 2.算法原理详解 && 代码实现…