【算法题解】45. N叉树的层序遍历

news2024/12/24 9:34:01

这是一道 中等难度 的题

https://leetcode.cn/problems/n-ary-tree-level-order-traversal/

题目

给定一个 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 1000 1000
  • 树的节点总数在 [ 0 , 1 0 4 ] [0, 10^4] [0,104] 之间

题解

树的层序遍历有一个固定的解题思路:

使用队列,一层一层的入队,然后再一层一层的按照入队顺序出队。

首先入队的是根结点,然后根节点出队,记录答案后将其子节点从左到右依次入队。

然后子节点再依次出队,出队时依然是记录答案后再将出队了的这个节点的子节点依次入队,就这样一层一层走下去。直到队列为空的时候,即遍历完成。

需要注意的是:题目要求每一层返回一个数组,所以我们需要知道每一层的节点个数(假如为 count ),那么取完 count 个节点后,再取就是下一层的节点了,就需要新开一个数组记录了。

以题目给定的示例一为例。

第二层节点是 324;共 3 个,所以取完这 3 个节点后,剩下的就是第三层了。

Java 代码为例:

while(!queue.isEmpty()){
    // 当前层的节点数
    int count = queue.size();

    // 当前这层入队的节点全部出队
    for(int i = 0; i < count; i++){
        // TODO 1.当前这层入队的节点一个一个的出队
        // TODO 2.记录答案
        // TODO 3.子节点依次入对列
    }
}

当队列不空的时候就一直循环取值,即外层 while 循环。

计算当前层有多少个节点,记为 count 。然后依次将这 count 个节点取出来,即内层 for 循环,这样 for 循环结束后队列中剩余的节点刚好就是下一层的所有节点,然后进入下一次 while 循环。

Java 代码实现

/*
// Definition for a Node.
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;
    }
};
*/

class Solution {
    public List<List<Integer>> levelOrder(Node root) {

        List<List<Integer>> ans = new ArrayList<>();
        if(root == null){
            return ans;
        }
        Queue<Node> queue = new LinkedList<>();
        queue.offer(root);

        while(!queue.isEmpty()){
            // 当前层的节点数
            int count = queue.size();
            List<Integer> depthAns = new ArrayList<>();
            for(int i = 0; i < count; i++){
                Node temp = queue.poll();
                depthAns.add(temp.val);

                // 子节点以此入队
                List<Node> children = temp.children;
                if(children != null){
                    for(Node c : children){
                        queue.offer(c);
                    }
                }
            }
            ans.add(depthAns);
        }

        return ans;
    }
}

Go 代码实现

Go 代码实现的时候,内层循环可以将 count 个节点取完后,再统一更新切片 queue

Go语言没有队列这一数据结构,可以使用切片模拟。

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Children []*Node
 * }
 */

func levelOrder(root *Node) (ans [][]int) {
    if root == nil {
        return
    }

    queue := []*Node{root}
    // 每一层的节点个数
    count := len(queue)
    for count > 0 {
        // 每一层的答案;
        levelAns := make([]int, count)
        for i := 0; i < count; i++ {
            out := queue[i]
            levelAns[i] = out.Val

            // 子节点入队
            children := out.Children
            if children != nil {
                for _, c := range children {
                    queue = append(queue, c)
                }
            }
        }

        queue = queue[count:]
        ans = append(ans, levelAns)
        // 计算下一层节点的个数
        count = len(queue)
        
    }
    
    return
    
}

复杂度分析

时间复杂度: O ( N ) O(N) O(N), N 为树中的节点个数,每个节点都有入队和出队两个操作。

空间复杂度: O ( N ) O(N) O(N)N 为树中的节点个数,空间复杂度取决于队列的大小,最大为 N

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

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

相关文章

fopen,fputs,fgets,fclose

fopen 是打开文件 fputs 往文件里面写内容(里面有2个参数其中第一个是一个char 型 数组用于存放读取的字符串&#xff0c;表示读取 1-n个字符。第二个表示是文件读入指针) fgets 读取文件里面的内容 (里面有三个参数其中 第一个是一个char 型 数组用于存放读取的字符串。第二…

阿里云安全组 IP地址段 设置方法 斜线后面数字含义

比如公司搬家后,我的ip变成了101.83.11.11 但我希望安全组中.只限制ip的前2段,后面两段是多少,都不会限制访问 先登录阿里云的服务器管理后台,找到主机,进安全组,添加 设置方法为 端口1234为自定义的,比如远程桌面访问你的服务器,源:就是ip地址段. 101.83.1.1/16解释 斜杠…

使用 Jetpack Compose 构建 LinearProgressIndicator

欢迎阅读这篇关于如何使用 Jetpack Compose 构建 LinearProgressIndicator&#xff08;线性进度指示器&#xff09;的博客。Jetpack Compose 是 Google 推出的一款现代化 UI 工具包&#xff0c;用于构建 Android 界面。其声明式的设计使得 UI 开发更加简洁、直观。 什么是 Line…

mfc100u.dll丢失的各种解决方法分享,探究mfc100u.dll文件

在计算机系统中&#xff0c;有许多重要的文件扮演着关键角色。其中之一就是Mfc100u.dll&#xff0c;一但这个文件丢失了&#xff0c;那么你的电脑就会出现问题&#xff0c;如程序运行不了等等。今天主要来给大家讲讲Mfc100u.dll这个文件&#xff0c;mfc100u.dll丢失的各种解决方…

由spring定时任务@Scheduled(cron = “0 0 0/1 * * ?“)引起的坑

这两天做到的一个功能&#xff0c;定时任务每整点生成一条记录&#xff0c;然后使用的cron表达式是&#xff1a; Scheduled(cron "0 0 0/1 * * ?")意为每整点执行一次。 定时任务执行之后使用new Date() 拿到当前本机时间&#xff0c;作为记录的创建时间&#xf…

使用Jmeter完成数据库造数

1.添加驱动 如果使用jmeter连接数据库&#xff0c;需要在jmeter的lib下添加对应的数据库驱动 MySQL: mysql-connector-jar Oracle: ojdbc6-11.2.0.3.jar ps:找到自己对应的驱动版本 2.bin目录启动 localhost bin % sh jmeter.sh ps: Jmeter版本&#xff1a;5.6 mysq…

在windows同时安装两个idea的方法教程

因为近期使用jdk17&#xff0c;所以需要升级Idea的版本&#xff0c;但是我电脑之前用的Idea2018,我又不想卸载&#xff0c;所以想同时装两个版本的。 安装教程如下&#xff1a; IDea官网&#xff1a;https://www.jetbrains.com.cn/idea/download/?sectionwindows 在官网下载.…

从文本、图像到音视频,AIGC技术将如何重构我们的数字世界?

引言 1950 年&#xff0c;艾伦图灵提出著名的「图灵测试」&#xff0c;给出判定机器是否具有智能的试验方法。16 年后&#xff0c;世界上第一款可人机对话的机器人“Eliza”问世&#xff0c;这是 AI 技术最早期的萌芽阶段。但由于当时的科技水平限制&#xff0c;AIGC 仅限于小…

【MySql】C语言连接mysql|图形化工具

文章目录 Connector/C 使用mysql接口介绍Navicat远程连接数据库 Connector/C 使用 说完了mysql的基础,后面我们只关心使用&#xff0c;要使用C语言连接mysql&#xff0c;需要使用mysql官网提供的库&#xff0c;前往官网下载即可。 但是实际上我们并不需要这样去做&#xff0c;…

Feign、Ribbon、Hystrix(铁三角)以及三者超时时间配置

在微服务架构中很多功能都需要调用多个服务才能完成某一项功能&#xff0c;一个成熟的微服务集群&#xff0c;内部调用必然依赖一个好的 RPC 框架&#xff0c;比如&#xff1a;基于 Http 协议的 Feign&#xff0c;基于私有 tcp 协议的 Dubbo 1. Feign 是什么 Feign 是Spring …

Consul 理解

Consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案&#xff0c;不再需要依赖其他工具&#xff08;比如ZooKeeper等&#xff09;。服务部署简单&#xff0c;只有一…

SpringBoot实现自定义配置属性提示

前言 我们在使用SpringBoot开发项目时&#xff0c;常常需要编写一些属性配置类&#xff0c;用来完成自定义或特定的属性配置。在配置文件application.yml中&#xff0c;IDEA会自动提示官方默认的相关配置且可以点击属性自动跳转到属性对应的配置类中&#xff0c;实现快速查看属…

力扣387:字符串中的第一个唯一字符

题目描述&#xff1a;给定一个字符串s&#xff0c;找到它的第一个不重复字符&#xff0c;并返回索引&#xff0c;如果不存在&#xff0c;则返回-1. 提示&#xff1a;s 不为空且 s 只包含小写字母 思路&#xff1a; 将字符串中的每个字符遍历一次&#xff0c;将其中每个字符以…

基于Java斗车交易系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

centos下的Nginx, tar安装不能使用systemctl启动问题

1.systemctl start nginx启动报错 2.报错原因 解压方式nginx&#xff0c;系统服务内没有nginx的服务&#xff0c;所以报错 3.配置nginx系统服务 1)/etc/init.d/目录下创建nginx 2)nginx文件内容 #!/bin/sh # nginx - this script starts and stops the nginx daemin # # c…

【漏洞案例】云上攻防之云主机中web应用自身漏洞

0x00 前言 最近在做项目的时候&#xff0c;测到了一个部署在云上的存在 Laravel UEditor SSRF 漏洞的站点&#xff0c;并且发现这个 SSRF 漏洞可以读取到临时凭证&#xff0c;这不巧了&#xff0c;正好最近写了一个云环境利用的工具。 开始之前这里先简单介绍一下这个工具&am…

(三)R-studio调度

1、准备测试脚本 from datetime import datetime print(111) print(datetime.now()) 2、设置定时调度 如果crontab没有安装&#xff0c;需要在root用户下安装&#xff0c;并启动&#xff0c;可参考&#xff1a;Ubuntu下crontab的安装和使用 (base) rstudio5abc0fae5cff:~/p…

JVM的OOM问题定位解决

1、生成dump文件&#xff08;错误日志文件&#xff09;&#xff0c;MAT可以进行解读 &#xff08;1&#xff09;参数 -XX:HeapDumpOnOutOfMemoryErrorOOM时导出堆到文件。 -Xms1m -Xmx8m -XX:HeapDumpOnOutOfMemoryError&#xff08;2&#xff09;设置参数 -Xms1m -Xmx8m -…

【Python】 Windows上通过git bash执行python卡住的解决方法

解决方法 编辑 C:\Program Files\Git\etc\profile.d\aliases.sh&#xff0c;将python2.7改成python 编辑完成后&#xff0c;重启git bash, 输入python即可 参考 https://blog.csdn.net/ofreelander/article/details/112058975

Linux网络环境配置

第一种方式&#xff08;自动获取&#xff09;&#xff1a; 说明&#xff1a;登陆后&#xff0c;通过界面的来设置自动获取IP 特点&#xff1a;Linux启动后会自动获取IP 缺点&#xff1a;是每次自动获取的IP地址可能不一样 第二种方法&#xff08;指定IP)&#xff1a; 1、说明…