这是我参与更文挑战的第 21 天,活动详情查看: 更文挑战
二叉树的层序遍历(102)
题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
进阶:
递归法很简单,你可以使用迭代法完成此题吗?
示例 1:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
思路分析
二叉树的层序遍历,也是很重要的一个知识点,除了前序、中序,后序(递归和迭代的写法都要掌握),我们还需要掌握层序遍历,通过一个队列,每次先记录下队列的大小,然后遍历这些次数。这样每次while循环时,我们遍历的都是一层的所有节点的个数,然后依次把这个节点的所有子节点都加进来。
代码展示
解法一:时间复杂度是,空间复杂度是。
public List<Integer> preorder(Node root) {
List<Integer> res = new ArrayList<>();
preorderInternal(root,res);
return res;
}
private void preorderInternal(Node root,List<Integer> res){
if(root == null){
return;
}
res.add(root.val);
for(int i = 0;i < root.children.size();++i){
preorderInternal(root.children.get(i),res);
}
}
N叉树的层序遍历(429)
题目描述
给定一个 N 叉树,返回其节点值的 后序遍历 。
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]之间
思路分析
N 叉树的层序遍历,我们也可以使用类似二叉树的层序遍历来进行遍历,通过一个队列,每次先记录下队列的大小,然后遍历这些次数。这样每次while循环时,我们遍历的都是一层的所有节点的个数,然后依次把这个节点的所有子节点都加进来。
我们也可以使用addAll方法一次把所有的子节点全部加进来。
代码展示
解法一:时间复杂度是,空间复杂度是。
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()){
int size = queue.size();
List<Integer> innerList = new ArrayList<>();
for(int i = 0;i < size;i++){
Node node = queue.poll();
innerList.add(node.val);
queue.addAll(node.children);
}
result.add(innerList);
}
return result;
}
总结
二叉树/N叉树的层序遍历,总体来说思路是比较相近的,都是利用队列每次遍历一层的数量,然后把该层节点的所有子节点一次加入队列中,知道直到结束。
二叉树/N叉树的前序、中序(N叉树没有)、后续遍历我们都要牢牢掌握,同时我们也应该掌握层序遍历,这些基础的知识一定要牢牢的掌握。