我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。
java
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//返回每一层节点值组成的二维列表
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if (root == null) {
return ret;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
// 将根节点入队,作为BFS搜索起点
queue.offer(root);
// while循环:队列不为空,说明还有节点没有遍历
while (!queue.isEmpty()) {
// level:临时存放【当前这一层】所有节点的值
List<Integer> level = new ArrayList<Integer>();
// 记录当前层的节点数量,重点!for循环只处理这一层的节点
int currentLevelSize = queue.size();
// for循环:循环currentLevelSize次,逐个取出当前层节点
for (int i = 1; i <= currentLevelSize; ++i) {
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
ret.add(level);
}
return ret;
}
}