429. N 叉树的层序遍历(中等)题解

题目描述

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

提示:

  • 树的高度不会超过 1000

  • 树的节点总数在 [0, 10^4] 之间


问题分析

这是一道典型的树的层序遍历问题。与二叉树的层序遍历相比,N叉树的特点是每个节点可以有任意数量的子节点。

要求:

  1. 按照层级顺序遍历树(从上到下,从左到右)

  2. 每一层的节点值要分组返回

  3. 需要区分不同的层级

思路:

  • 使用广度优先搜索(BFS)是最直观的解法

  • 也可以使用深度优先搜索(DFS),配合层级信息

  • 需要记录每个节点所在的层级


解题思路

方法一:广度优先搜索(BFS)

BFS是解决层序遍历问题的经典方法,因为BFS天然按照层级顺序访问节点。

算法步骤:

  1. 使用队列存储节点,队列的特性保证了先进先出的层序访问

  2. 每次处理队列中的所有节点(即当前层的所有节点)

  3. 在处理当前层节点时,将它们的子节点加入队列(为下一层做准备)

  4. 记录每一层的节点值

优势:

  • 逻辑直观,容易理解

  • 代码结构清晰

  • 时间复杂度优秀

方法二:深度优先搜索(DFS)

DFS通过递归的方式遍历树,同时记录当前节点的层级信息。

算法步骤:

  1. 递归遍历每个节点

  2. 传递层级参数,记录当前节点所在的层

  3. 根据层级将节点值放入对应的结果列表中

  4. 递归处理所有子节点

优势:

  • 代码简洁

  • 不需要额外的队列数据结构

  • 递归思维自然


算法图解

以示例1为例:root = [1,null,3,2,4,null,5,6]

树结构:1/  |  \3   2   4/ \5   6

BFS执行过程:

  1. 初始状态:队列 = [1],结果 = []

  2. 第1层

    • 处理节点1,当前层 = [1]

    • 将节点1的子节点加入队列:队列 = [3,2,4]

    • 结果 = [[1]]

  3. 第2层

    • 处理节点3,2,4,当前层 = [3,2,4]

    • 将节点3的子节点加入队列:队列 = [5,6]

    • 结果 = [[1],[3,2,4]]

  4. 第3层

    • 处理节点5,6,当前层 = [5,6]

    • 没有子节点,队列为空

    • 结果 = [[1],[3,2,4],[5,6]]

DFS执行过程:

  1. 访问节点1(level=0):result[0] = [1]

  2. 访问节点3(level=1):result[1] = [3]

  3. 访问节点5(level=2):result[2] = [5]

  4. 访问节点6(level=2):result[2] = [5,6]

  5. 访问节点2(level=1):result[1] = [3,2]

  6. 访问节点4(level=1):result[1] = [3,2,4]


详细代码实现

Java 实现

Java N叉树节点定义

// Java N叉树节点定义
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
}

BFS 方法

import java.util.*;class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> result = new ArrayList<>();// 边界条件检查if (root == null) {return result;}// 使用队列进行广度优先搜索Queue<Node> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {// 当前层的节点数量int levelSize = queue.size();// 当前层的节点值列表List<Integer> currentLevel = new ArrayList<>();// 处理当前层的所有节点for (int i = 0; i < levelSize; i++) {Node currentNode = queue.poll();currentLevel.add(currentNode.val);// 将当前节点的所有子节点加入队列if (currentNode.children != null) {for (Node child : currentNode.children) {queue.offer(child);}}}// 将当前层的结果加入最终结果result.add(currentLevel);}return result;}
}

DFS 方法

import java.util.*;class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> result = new ArrayList<>();// 边界条件检查if (root == null) {return result;}// 从根节点开始DFS,初始层级为0dfs(root, 0, result);return result;}private void dfs(Node node, int level, List<List<Integer>> result) {// 如果是新的层级,需要创建新的列表if (level >= result.size()) {result.add(new ArrayList<>());}// 将当前节点的值加入对应层级的列表result.get(level).add(node.val);// 递归处理所有子节点,层级加1if (node.children != null) {for (Node child : node.children) {dfs(child, level + 1, result);}}}
}

C# 实现

C# N叉树节点定义

// C# N叉树节点定义
public class Node {public int val;public IList<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, IList<Node> _children) {val = _val;children = _children;}
}

BFS 方法

using System.Collections.Generic;public class Solution {public IList<IList<int>> LevelOrder(Node root) {IList<IList<int>> result = new List<IList<int>>();// 边界条件检查if (root == null) {return result;}// 使用队列进行广度优先搜索Queue<Node> queue = new Queue<Node>();queue.Enqueue(root);while (queue.Count > 0) {// 当前层的节点数量int levelSize = queue.Count;// 当前层的节点值列表IList<int> currentLevel = new List<int>();// 处理当前层的所有节点for (int i = 0; i < levelSize; i++) {Node currentNode = queue.Dequeue();currentLevel.Add(currentNode.val);// 将当前节点的所有子节点加入队列if (currentNode.children != null) {foreach (Node child in currentNode.children) {queue.Enqueue(child);}}}// 将当前层的结果加入最终结果result.Add(currentLevel);}return result;}
}

DFS 方法

using System.Collections.Generic;public class Solution {public IList<IList<int>> LevelOrder(Node root) {IList<IList<int>> result = new List<IList<int>>();// 边界条件检查if (root == null) {return result;}// 从根节点开始DFS,初始层级为0Dfs(root, 0, result);return result;}private void Dfs(Node node, int level, IList<IList<int>> result) {// 如果是新的层级,需要创建新的列表if (level >= result.Count) {result.Add(new List<int>());}// 将当前节点的值加入对应层级的列表result[level].Add(node.val);// 递归处理所有子节点,层级加1if (node.children != null) {foreach (Node child in node.children) {Dfs(child, level + 1, result);}}}
}

复杂度分析

BFS方法

  • 时间复杂度:O(n),其中n是树中节点的总数。每个节点恰好被访问一次。

  • 空间复杂度:O(n),主要是队列和结果数组的空间开销。最坏情况下,队列中可能存储接近n/2个节点(最底层)。

DFS方法

  • 时间复杂度:O(n),每个节点恰好被访问一次。

  • 空间复杂度:O(h),其中h是树的高度。主要是递归调用栈的深度,最坏情况下为O(n)(退化为链状树)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918637.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918637.shtml

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

相关文章

Java 课程,每天解读一个简单Java之题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

package ytr250813;import java.io.IOException;public class CharacterCounter {public static void main(String[] args) throws IOException {// 初始化计数器变量int letterCount 0; // 英文字母计数器int spaceCount 0; // 空格计数器int digitCount 0; // 数字计数器i…

GitLab CI + Docker 自动构建前端项目并部署 — 完整流程文档

一、环境准备1. 服务器准备一台Linux服务器&#xff08;CentOS/Ubuntu皆可&#xff09;&#xff0c;推荐至少4核8GB内存已安装 Docker&#xff08;及 Docker 服务已启动&#xff09;已安装 GitLab Runner2. 服务器上安装 Docker &#xff08;如果没装&#xff09;# CentOS9以下…

LCP 17. 速算机器人

目录 题目链接&#xff1a; 题目&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 总结&#xff1a; 题目链接&#xff1a; LCP 17. 速算机器人 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; # LCP 17. 速算机器人 小扣在秋日市集发现了一款速算机器人。…

Spring cloud集成ElastictJob分布式定时任务完整攻略(含snakeyaml报错处理方法)

ElasticJob 是一款轻量级、可扩展的分布式定时任务解决方案&#xff0c;基于 Quartz 二次开发&#xff0c;支持任务分片、失效转移、任务追踪等功能&#xff0c;非常适合在 Spring Cloud 微服务场景中使用。我将带你完成 Spring Cloud 集成 ElasticJob 的全过程&#xff0c;并分…

了解 Linux 中的 /usr 目录以及 bin、sbin 和 lib 的演变

Linux 文件系统层次结构是一个复杂且引人入胜的体系&#xff0c;其根源深植于类 Unix 操作系统的历史之中。在这一结构的核心&#xff0c;/usr 目录是一个至关重要的组成部分&#xff0c;随着时间的推移&#xff0c;它经历了显著的演变。与此同时&#xff0c;/bin、/sbin、/lib…

高级IO(五种IO模型介绍)

文章目录一、IO为什么慢&#xff1f;一、阻塞IO二、非阻塞IO三、信号驱动IO四、IO多路复用五、异步IO一、IO为什么慢&#xff1f; IO操作往往都是和外设交互&#xff0c;比如键盘、鼠标、打印机、磁盘。而最常见的就是内存与磁盘的交互&#xff0c;要知道磁盘是机械设备&#…

第十二节:粒子系统:海量点渲染

第十二节&#xff1a;粒子系统&#xff1a;海量点渲染 引言 粒子系统是创造动态视觉效果的神器&#xff0c;从漫天繁星到熊熊火焰&#xff0c;从魔法特效到数据可视化&#xff0c;都离不开粒子技术。Three.js提供了强大的粒子渲染能力&#xff0c;可轻松处理百万级粒子。本文将…

LeetCode Day5 -- 二叉树

目录 1. 啥时候用二叉树&#xff1f; &#xff08;1&#xff09;典型问题 &#xff08;2&#xff09;核心思路 2. BFS、DFS、BST 2.1 广度优先搜索BFS &#xff08;1&#xff09;适用任务 &#xff08;2&#xff09;解决思路​​&#xff1a;使用队列逐层遍历 2.2 深度…

<c1:C1DateTimePicker的日期时间控件,控制日期可以修改,时间不能修改,另外控制开始时间的最大值比结束时间小一天

两个时间控件 <c1:C1DateTimePicker Width"170" EditMode"DateTime" CustomDateFormat"yyyy-MM-dd" CustomTimeFormat"HH:mm:ss" Style"{StaticResource ListSearch-DateTimePicker}" x:Name"dateTimePicker"…

文件完整性监控工具:架构和实现

文件完整性监控(FIM)作为一道关键的防御层&#xff0c;确保系统和网络中文件及文件夹的完整性与安全性。文件完整性监控工具通过监控关键文件的变更并检测未经授权的修改&#xff0c;提供关于潜在安全漏洞、恶意软件感染和内部威胁的早期警报。为了使文件完整性监控工具发挥实效…

Linux信号量和信号

1.温故知新上一篇博客&#xff0c;我们又知道了一种进程间通信的方案&#xff1a;共享内存。它是在物理内存中用系统调用给我们在物理内存开辟一个共享内存&#xff0c;可以由多个进程的页表进行映射&#xff0c;共享内存不和管道一样&#xff0c;它的生命周期是随内核的&#…

腾讯测试岗位面试真题分析

以下是对腾讯测试工程师面试问题的分类整理、领域占比分析及高频问题精选&#xff08;基于​​92道问题&#xff0c;总出现次数118次​​&#xff09;。问题按​​7大技术领域​​划分&#xff0c;高频问题标注优先级&#xff08;1-5&#x1f31f;&#xff09;&#xff1a; 不…

全面解析远程桌面:功能实现、性能优化与安全防护全攻略

远程桌面技术已成为工作与生活中不可或缺的协作工具&#xff0c;但在实际应用中&#xff0c;用户常遇到连接失败、卡顿延迟、安全隐患等问题。本文从远程桌面功能原理、网络与性能优化、安全防护策略、跨平台兼容性等角度&#xff0c;详细解析常见问题的解决方案&#xff0c;并…

【问题】Mybatis-plus框架使用@Select注解编写查询SQL,json字段查询转换失败

问题描述在使用mybaits-plus的时候定义的Mapper接口实现了BaseMapper&#xff0c;没有编写Mapper对应的xml&#xff0c;大部分查询使用框架的接口进行查询基本属性返回都是正常&#xff0c;复杂对象在sql中会进行查询&#xff0c;但是返回对象中却未包含相关属性。问题原因 没有…

Python多线程实现大文件下载

Python多线程实现大文件下载 在互联网时代&#xff0c;文件下载是日常操作之一&#xff0c;尤其是大文件&#xff0c;如软件安装包、高清视频等。然而&#xff0c;网络条件不稳定或带宽有限时&#xff0c;下载速度会变得很慢&#xff0c;令人抓狂。幸运的是&#xff0c;通过多线…

【R语言】RStudio 中的 Source on Save、Run、Source 辨析

RStudio 中的 Source on Save、Run、Source 辨析 在使用 RStudio 进行 R 语言开发时&#xff0c;我们会在主界面左上角看见三个按钮&#xff1a;Source on Save、Run、Source 。 本文将带你从概念、使用方法、快捷键、使用场景以及注意事项等方面详细解析这三个功能。 文章目录…

蓝桥杯算法之搜索章 - 4

目录 文章目录 前言 一、记忆化搜索 二、题目概略 三、斐波拉契数 四、Function 五、天下第一 六、滑雪 总结 亲爱的读者朋友们&#xff0c;大家好啊&#xff01;不同的时间&#xff0c;相同的地点&#xff0c;今天又带来了关于搜索部分的讲解。接下来我将接着我前面文章的内容…

抗量子加密技术前瞻:后量子时代的密码学革命

目录抗量子加密技术前瞻&#xff1a;后量子时代的密码学革命1. 量子计算威胁现状1.1 量子霸权里程碑1.2 受威胁算法1.3 时间紧迫性2. 抗量子密码学体系2.1 技术路线对比2.2 数学基础革新3. 标准化进程3.1 NIST PQC标准化时间线3.2 当前推荐算法4. 技术实现方案4.1 Kyber密钥交换…

基于STM32设计的矿山环境监测系统(NBIOT)_262

文章目录 一、前言 1.1 项目介绍 【1】开发背景 【2】研究的意义 【3】最终实现需求 【4】项目硬件模块组成 1.2 设计思路 【1】整体设计思路 【2】上位机开发思路 1.3 项目开发背景 【1】选题的意义 【2】摘要 【3】国内外相关研究现状 【5】参考文献 1.4 开发工具的选择 【1】…

电脑如何安装win10专业版_电脑用u盘安装win10专业版教程

电脑如何安装win10专业版&#xff1f;电脑还是建议安装win10专业版。Win分为多个版本&#xff0c;其中家庭版&#xff08;Home&#xff09;和专业版&#xff08;Pro&#xff09;是用户选择最多的两个版本。win10专业版在功能以及安全性方面有着明显的优势&#xff0c;所以电脑还…