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

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;
    }
}

在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-18 07:34:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-18 07:34:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-18 07:34:02       82 阅读
  4. Python语言-面向对象

    2024-02-18 07:34:02       91 阅读

热门阅读

  1. redis的hash数据结构底层简记

    2024-02-18 07:34:02       52 阅读
  2. 机器人学环境配置(VM-16 + Ubuntu-20.04 + ROS-noetic)

    2024-02-18 07:34:02       66 阅读
  3. Unity-HDRP-Sense-4

    2024-02-18 07:34:02       47 阅读
  4. 力扣代码学习日记三

    2024-02-18 07:34:02       55 阅读
  5. 配置Vite+React+TS项目

    2024-02-18 07:34:02       43 阅读
  6. Docker 第十五章 : Docker 三剑客之 Compose(一)

    2024-02-18 07:34:02       42 阅读