N叉树的层序遍历
题目链接: 力扣题目链接
难度:中等
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
示例
输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]
节点的定义
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>> result = new ArrayList<>();
if(root == null){
return result;
}
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int len = queue.size();
List<Integer> list = new ArrayList<>();
for(int i=0;i<len;i++){
Node tempNode = queue.poll();
list.add(tempNode.val);
queue.addAll(tempNode.children);
}
result.add(list);
}
return result;
}
}
方式二:递归代码
(1) 找出重复的子问题。遍历最左边的子树,再遍历靠左的子树,…,一直遍历完最右边的子树。
需要注意的是,在遍历子树的时候,涉及到向上或者向下遍历,为了让递归的过程中的同一层的节点放在同一个列表中,在递归时要记录深度 depth。
同时,每次遍历到一个新的 depth,结果数组中没有对应的 depth 的列表时,在结果数组中创建一个新的列表保存该 depth 的节点。
(2) 确定终止条件。
对于二叉树的遍历来说,想终止,即没东西遍历了,没东西遍历自然就停下来了。
即最下面一层的左右节点都为空了。
class Solution {
private List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> levelOrder(Node root) {
level(root, 0);
return result;
}
private void level(Node root, int depth) {
if(root ==null){
return;
}
depth++;
if (result.size() < depth) {
result.add(new ArrayList<>());
}
result.get(depth - 1).add(root.val);
for (Node child : root.children) {
level(child, depth);
}
}
}