唯美网站模板,自己做的网站转成二维码,浙江省交通建设工程监督管理局网站,赣州热门网站429. N 叉树的层序遍历
给定一个 N 叉树#xff0c;返回其节点值的层序遍历。#xff08;即从左到右#xff0c;逐层遍历#xff09;。
树的序列化输入是用层序遍历#xff0c;每组子节点都由 null 值分隔#xff08;参见示例#xff09;。
- 示例 1#xff1a;输入…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] 之间
解题思路
我们使用队列实现层序遍历因为如果使用 ArrayList 的话我们删除元素需要 O(n) 的时间复杂度。而队列删除元素只需要 O(1)的时间。
并且在while 循环体开始时记录队列的当前大小 size。然后用另一个循环来处理 size 数量的节点这样我们就可以保证我们每次使队列出队的都是位于同一层的节点并且后面入队的节点也全是位于当前层的下一层保证 了while 循环在每一次迭代处理一层。而传统层序遍历是加入左右节点的而这个题目里面我们是需要加入一个list的子节点所以我们需要再使用一个循环把整个list的子节点入队。
代码
/*
// Definition for a Node.
class Node {public int val;public ListNode children;public Node() {}public Node(int _val) {val _val;}public Node(int _val, ListNode _children) {val _val;children _children;}
};
*/class Solution {public ListListInteger levelOrder(Node root) {QueueNodequeuenew LinkedList();queue.add(root);ListListInteger resnew ArrayList(); if(rootnull) return res;while(!queue.isEmpty()){int sizequeue.size();ListInteger listnew ArrayList();for(int i0;isize;i){Node nodequeue.poll();list.add(node.val);for(Node cur:node.children)queue.add(cur);}res.add(list);}return res;}
}时间复杂度O(n)。n 指的是节点的数量。空间复杂度O(n)。