题目:
给定一个 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] 之间
解法1:递归
/**
* 思路:
* 递归,记录当前的层级
* 只要当前的层级大于等于了,当前结果集的长度就创建一个ArrayList
* 之后获取当前层级的ArrayList,加入当前元素
* 递归
*/
public List<List<Integer>> levelOrder(Node root) {
ArrayList<List<Integer>> result = new ArrayList<>();
recursive(root,result,0);
return result;
}
private void recursive(Node root, ArrayList<List<Integer>> result, int level) {
if (root==null)return;
if (level>=result.size()){
result.add(new ArrayList<>());
}
result.get(level).add(root.val);
if (root.children!=null){
for (Node n:root.children) {
recursive(n,result,level+1);
}
}
}
时间复杂度:On
空间复杂度:On
解法2:queue
/**
* 思路:
* 记录当前层的队列长度
* 取出当前层的所有元素加入到集合,并且把当前层的children加入到队列
*/
public List<List<Integer>> levelOrder(Node root) {
ArrayList<List<Integer>> result = new ArrayList<>();
if (root==null)return result;
ArrayDeque<Node> queue = new ArrayDeque<>();
queue.push(root);
while (!queue.isEmpty()){
int size = queue.size();
ArrayList<Integer> list = new ArrayList<>();
for (int i=0;i<size;i++){
Node poll = queue.poll();
if (poll.children!=null) {
for (Node n : poll.children) {
queue.offer(n);
}
}
list.add(poll.val);
}
result.add(list);
}
return result;
}
时间复杂度:On^2
空间复杂度:On