⭐北邮复试刷题429. N 叉树的层序遍历(按层入队出队BFS)(力扣每日一题)

news/2024/6/29 12:02:18 标签: 宽度优先, 算法, 北邮, Java

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] 之间

在这里插入图片描述

题解:

主要思路就是常规BFS,只不过每次从队列拿元素的时候一次将一层的节点全部拿出,再将这些节点下层的children都同时入队即可。这样会造成最后多一次入队出队,所以最后加上一次判空操作即可;

代码:

/*
// 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) {
        Queue<Node> queue = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if(root == null){
            return res;
        }

        queue.offer(root);
        List<Integer> list = new ArrayList<>();
        list.add(root.val);
        res.add(list);
        while(!queue.isEmpty()){
            // 队列想边拿边加时,则利用长度字段;想只拿不加可以用队列判空,最后队列再加;
            List<List<Node>> tmpList = new ArrayList<>();
            while(!queue.isEmpty()){
                // 出队
                // 将同层的节点一次拿出
                Node tmpQueueOne = queue.poll();
                if(tmpQueueOne.children != null)
                    tmpList.add(tmpQueueOne.children);
            }
            if(tmpList == null || tmpList.size() == 0)
                continue;
            int tmpLen = tmpList.size();
            List<Integer> tmpResOfOne = new ArrayList<>();
            for(int i=0;i<tmpLen;i++){
                if(tmpList.get(i) != null){
                    for(int j=0;j<tmpList.get(i).size();j++){
                        tmpResOfOne.add(tmpList.get(i).get(j).val);
                        // 入队
                        // 将本层下层的孩子全部同时入队
                        queue.offer(tmpList.get(i).get(j));
                    }
                }
            }
            if(tmpResOfOne == null || tmpResOfOne.size() == 0)
                continue;
            res.add(tmpResOfOne);
        }
        return res;
    }
}

在这里插入图片描述


http://www.niftyadmin.cn/n/5380579.html

相关文章

【MATLAB GUI】 1. 普通按钮、静态文本和可编辑文本

看B站up主freexyn的freexyn编程实例视频教程系列36Matlab GUI的学习笔记 文章目录 初步认识普通按钮静态文本和可编辑文本设计一个简易计算机 初步认识普通按钮 任务要求&#xff1a;点击一次“100”按钮&#xff0c;按钮上的文字值就递增1&#xff1b;点击“close”按钮&…

PS的常用快捷方式有哪些?

Adobe Photoshop&#xff08;简称 PS&#xff09;是一款流行的图像处理软件。以下是一些常用的 Photoshop 快捷方式&#xff1a; 文件操作&#xff1a; 新建文件&#xff1a;Ctrl N&#xff08;Windows&#xff09;/ Command N&#xff08;Mac&#xff09;打开文件&#xff1…

CSS的注释:以“ /* ”开头,以“ */ ”结尾

CSS的注释:以“ /* ”开头&#xff0c;以“*/”结尾 CSS的注释: 以“ /* ”开头&#xff0c;以“ */ ”结尾 在CSS中&#xff0c;注释是一种非常重要的工具&#xff0c;它们可以帮助开发者记录代码的功能、用法或其他重要信息。这些信息对于理解代码、维护代码以及与他人合作都…

java中的数据结构及数据类型转换

基本数据类型&#xff08;4类8种&#xff09; 数据类型关键字内存占用取值范围说明字节byte1个字节-128 ~ 127短整型short2个字节-32768 ~ 32767整型int&#xff08;默认&#xff09;4个字节-231 ~ 231-1&#xff08;21个亿&#xff09;长整型long8个字节-263 ~ 263-&#xff…

乡政府|乡政府管理系统|基于Springboot的乡政府管理系统设计与实现(源码+数据库+文档)

乡政府管理系统目录 目录 基于Springboot的乡政府管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、活动信息管理 3、新闻类型管理 4、新闻动态管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

「算法」二分查找1:理论细节

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;算法详解 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 二分查找算法简介 这个算法的特点就是&#xff1a;细节多&#xff0c;出错率高&#xff0c;很容易就写成死循环有模板&#xff0c;但…

BuildAdmin - 免费开源可商用!基于 ThinkPHP8 和 Vue3 等流行技术栈打造的商业级后台管理系统

一款包含 PHP 服务端和 Vue 前端代码的 admin 管理系统&#xff0c;实用性很强&#xff0c;推荐给大家。 BuildAdmin 是一个成熟的后台管理系统&#xff0c;后端服务采用 ThinkPHP8 &#xff0c;数据库使用 Mysql&#xff0c;前端部分则使用当前流行的 Vue3 / TypeScript / Vi…

春节专题|产业7问:区块链厂商的现在和未来——数字资产厂商

2023转瞬即逝&#xff0c;不同于加密领域沉寂一整年后在年末集中爆发&#xff0c;对于我国的区块链厂商而言&#xff0c;稳中求胜才是关键词&#xff0c;在平稳发展的基调下&#xff0c;产业洗牌也悄无声息的到来。 从产业总体而言&#xff0c;在经过了接近3年的快速发展后&…