题目
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
在树上使用队列的遍历算法的基本算法
List<Integer> values = new ArrayList<>(); //用于盛放按顺序拿出来的值
Queue<Node> queue = new LinkedList<>();
//用于盛放每一层的节点,队列存放节点。首先将根节点放到队列中,
//当队列不为空时,则在队列取出一个节点,并将其子节点添加到队列中
queue.add(root);//队列加入根节点
while (!queue.isEmpty()){
Node nextNode = queue.remove();//remove()返回第一个元素,并在队列中将之删除,用于指定对哪个节点的子节点进行遍历
values.add(nextNode.val);//将拿出来的队列中节点的值放入values数组中
for(Node child : nextNode.children) { //循环用于按层序遍历顺序把节点放到队列中,这个循环可以用queue.addAll(nextNode.children)代替
queue.add(child);
}
}
对于此题的解法:除了上面的内容还需要把得到的values数组按层拆分开来
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.add(root);
while(!queue.isEmpty()){
List<Integer> level = new ArrayList<>();//这个level指的是每一层里面遍历出来的数组。
int size = queue.size();
for (int i = 0;i<size;i++) {
Node nextNode = queue.poll();//这里专门用poll方法替换了remove方法,从而在遍历queue为空的时候,刚好输出一个null
level.add(node.val);
queue.addAll(nextNode.children);
}
result.add(level);//循环完以后把每一层的数组加入到result数组中去。
}
return result;
}
}
题目地址:
429. N 叉树的层序遍历