题目

类型:Tree

难度:中等

二叉树的层序遍历 - 图1

解题思路

用广度优先搜索。

用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类,分类的时候利用哈希表,维护一个以 level 为键,对应节点值组成的数组为值,广度优先搜索结束以后按键 level 从小到大取出所有值,组成答案返回即可。

如何不用哈希映射,并且只用一个变量 node 表示状态,可以用一种巧妙的方法修改广度优先搜索

  • 首先根元素入队
  • 当队列不为空时

    • 求当前队列的长度Si
    • 依次从队列中取出Si个元素进行拓展,然后进入下一次迭代

代码

  1. class Solution {
  2. public List<List<Integer>> levelOrder(TreeNode root) {
  3. List<List<Integer>> ret = new ArrayList<List<Integer>>();
  4. if (root == null) {
  5. return ret;
  6. }
  7. Queue<TreeNode> queue = new LinkedList<TreeNode>();
  8. queue.offer(root);
  9. while (!queue.isEmpty()) {
  10. List<Integer> level = new ArrayList<Integer>();
  11. int currentLevelSize = queue.size();
  12. for (int i = 1; i <= currentLevelSize; ++i) {
  13. TreeNode node = queue.poll();
  14. level.add(node.val);
  15. if (node.left != null) {
  16. queue.offer(node.left);
  17. }
  18. if (node.right != null) {
  19. queue.offer(node.right);
  20. }
  21. }
  22. ret.add(level);
  23. }
  24. return ret;
  25. }
  26. }