我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。
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; } }