【LeetCode】 N 叉树的层序遍历Java题解

227 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

题目描述

给定一个 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]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法每日一题是树的遍历题目,题意比较容易理解,有多种解法。
  • 这个题目,我采用了 queue 这种数据结构解决问题。 队列(queue)是一种具有「先进入队列的元素一定先出队列」性质的表。由于该性质,队列通常也被称为先进先出(first in first out)表,简称 FIFO 表。
  • 在解题过程中,直接将 node 放入队列,然后判断是否有 child, 如果有,将 child 放入队列。如何判断是否是当前层,可以采用 int size = queue.size(); 记录当前层元素的个数,然后逐个处理。

通过代码

/*
// 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 size = queue.size();
            List<Integer> currentLevel = new ArrayList<>();
            for (int i = 0; i < size; i++) {
                Node temp = queue.poll();
                if (temp != null) {
                    currentLevel.add(temp.val);
                    if (temp.children != null) {
                        for (Node childrenNode : temp.children) {
                            queue.offer(childrenNode);
                        }
                    }
                }
            }
            ans.add(currentLevel);
        }

        return ans;
    }
}

image.png

总结

  • 上述代码的时间复杂度是O(n),空间复杂度是O(n)
  • 坚持算法每日一题,加油!