1 题目描述
给定一个 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)
链接:429. N 叉树的层序遍历
2 算法设计
本题实际上和二叉树的层次遍历是一样的,唯一的不同就是再遍历N叉树时,父节点的孩子节点可能有多个,需要遍历孩子节点数组。这里还是采用广度遍历优先的迭代算法来实现,从根节点开始,不断向下进行迭代遍历每一层的节点元素,然后用一个队列来存储遍历到的节点,最后将节点的元素值存进结果的list数组即可。
3 代码实现
class Solution {
public List<List<Integer>> levelOrder(Node root) {
return levelSearch(root);
}
public List<List<Integer>> levelSearch(Node root){
//最后要返回的结果数组
List<List<Integer>> resList = new ArrayList<>();
if (root == null) return new ArrayList<>();
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
//对树的每一层进行迭代遍历
while (!queue.isEmpty()){
ArrayList<Integer> tmpList = new ArrayList<>();
int len = queue.size();
while (len > 0){
Node tmpNode = queue.poll();
tmpList.add(tmpNode.val);
//如果当前节点有孩子节点,遍历到队列中
if (tmpNode.children != null){
for (Node node:tmpNode.children){
queue.offer(node);
}
}
len--;
}
resList.add(tmpList);
}
return resList;
}
}
4 运行结果