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

devtools/2024/9/24 5:06:56/

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/devtools/98508.html

相关文章

前端(Vue)headerSearch(页面搜索)通用解决方案 及 原理

简介 击后弹出输入框输入框可以输入页面的索引&#xff0c;比如项目中包含了文章相关的点击后可以进入对应界面同时也支持英文索引 原理 headerSearch 是复杂后台系统中非常常见的一个功能&#xff0c;它可以&#xff1a;在指定搜索框中对当前应用中所有页面进行检索&#…

【大模型微调训练与实操】微调 Llama 3 并在本地使用

目标&#xff1a;根据医患对话数据集对 Llama 3 进行微调&#xff0c;创建一个专门针对医疗对话的模型。在合并、转换和量化模型后&#xff0c;它将可以通过 Jan 应用程序供本地私人使用。 在本教程中&#xff0c;我们将学习如何在医学数据集上微调 Llama 3。我们还将通过 Ja…

算法基础及例题

1、双指针 维护区间信息、子序列匹配、利用序列有序性、单项链表找环双指针 - OI Wiki (oi-wiki.org) 盛最多水的容器https://leetcode.cn/problems/container-with-most-water/ public class Solution {public int maxArea(int[] height) {int l 0, r height.length - 1;int…

如何制作统信UOS启动盘?

如何制作统信UOS启动盘&#xff1f; 一、下载UOS系统安装镜像二、在UOS系统环境下制作启动盘步骤一&#xff1a;准备U盘步骤二&#xff1a;打开启动盘制作工具步骤三&#xff1a;选择ISO镜像文件步骤四&#xff1a;选择安装介质并格式化步骤五&#xff1a;等待制作完成 三、在W…

算法-(383哈希表赎金信)

这道题可以利用哈希表来做。我们首先来了解以下哈希表 哈希表是一种强大的数据结构&#xff0c;因为它能够在平均情况下提供常数时间复杂度的查找、插入和删除操作。这使得它在实现字典、集合以及缓存等场景中非常高效。 主要特点 快速查找&#xff1a;通过哈希函数将键映射到…

Git 的基本概念和使用方式

Git是一种分布式版本控制系统&#xff0c;用于跟踪文件的更改并协同多人开发项目。它具有以下基本概念和使用方式&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git使用仓库来存储项目的文件和历史记录。仓库可以是本地的&#xff08;在本地计算机上&#x…

T/CECS 10035-2019 绿色建材评价 金属复合装饰材料

一、绿色建材 绿色建材是指在全生命周期内减少对天然资源消耗和减轻对生态环境影响&#xff0c;具有节能、减排、安全、便利和可循环的建材产品&#xff0c;获得绿色产品证书的产品在实际招投标以及品牌宣传中具有绝对优势。 二、认证模式 初始工厂检查产品抽样检验获证后监督…

Nvidia AI 发布 Llama-Minitron 3.1 4B:通过修剪和提炼 Llama 3.1 8B 构建的新语言模型

Nvidia 刚刚发布了语言模型的新版本&#xff0c;不过这次是一个小型语言模型&#xff1a;Llama-3.1-Minitron 4B 模型。这意味着它是语言模型不断发展的重要步骤之一&#xff0c;通过剪枝和知识提炼等尖端技术&#xff0c;将大型模型的效率与小型模型相结合。 Llama-3.1-Minitr…