题目
代码部分一(9ms)
class Solution {
List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> levelOrder(Node root) {
if(root == null)
return res;
List<Integer> list = new ArrayList();
Queue<Node> queue = new LinkedList();
queue.add(root);
int size = queue.size();
while(!queue.isEmpty()){
Node temp = queue.poll();
list.add(temp.val);
for(Node node : temp.children){
queue.add(node);
}
size--;
if(size == 0){
size = queue.size();
res.add(list);
list = new ArrayList();
}
}
return res;
}
}
-
若树为空,返回 null
-
创建队列 queue ,并将根节点 root 入队,获得队列长度 size
-
当队列不为空时,取出(会删除)队首节点,将其值加入 list ,并将取出节点的子节点(下一层节点)入队
-
若当前层的节点是否都遍历完了,将新队列长度赋予size , 将 list 加入res,初始化 list
-
返回 res
代码部分二(5ms)
class Solution {
List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> levelOrder(Node root) {
bfs(root, 0);
return res;
}
public void bfs(Node root, int level){
if(null == root)
return;
if(level == res.size())
res.add(new ArrayList());
res.get(level).add(root.val);
for(Node node : root.children)
bfs(node, level+1);
}
}
-
调用宽度遍历 bfs()
-
若当前节点为空,结束遍历
-
判断当前层次是否有记录,若无,创建新 list
-
将当前节点值加入到对应层次中
-
继续遍历子节点
-
返回 res