LeetCode102-二叉树的层次遍历

题目链接

英文链接:https://leetcode.com/problems/binary-tree-level-order-traversal/

中文链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

题目详述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

1
2
3
4
5
  3
/ \
9 20
/ \
15 7

返回其层次遍历结果:

1
2
3
4
5
[
[3],
[9,20],
[15,7]
]

题目详解

二叉树的层次遍历比较简单,难点在于哪些结点在同一层,如何判断进入下一层。

  • 新建一个队列来进行层次遍历。
  • 每次进入外循环保存当前队列的大小,即这一层的节点数。
  • 运用内循环用于处理,并让下一层的结点入队。
  • 这样可以保证退出内循环时,下一层的结点已经全部入队。
  • 一次处理一层结点,如此反复,直至队列为空。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class LeetCode_00102 {

public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new LinkedList<>();
Queue<TreeNode> queue = new LinkedList<>();
if (root != null) {
queue.offer(root);
}
while (!queue.isEmpty()) {
// 每一层的结点个数
int size = queue.size();
// 用来存储这一层结点的链表
List<Integer> level = new LinkedList<>();
while (size-- != 0) {
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
res.add(level);
}
return res;
}
}

也可以用递归来做。每次把结点值加入链表前,先把表示这一层的链表加入到结果中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class LeetCode_00102 {

public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
traverse(root, 1, res);
return res;
}

private void traverse(TreeNode root, int level, List<List<Integer>> res) {
if (root == null) {
return;
}
if (res.size() < level) {
res.add(new ArrayList<>());
}
res.get(level - 1).add(root.val);
traverse(root.left, level + 1, res);
traverse(root.right, level + 1, res);
}

}