基本思路

难点在于怎么在遍历每一层时将该层的节点值加入到属于该层的列表中,一开始想到的是用栈保存节点,出栈时将节点值加入数组,再将该节点的子节点入栈,但是栈是先进后出的结构,不太符合从左到右的遍历顺序,而且不知道如何确定出栈时该节点属于哪一层。

使用队列初始时保存根节点,节点出队将当前节点的值加入当前层的数组,再将该节点的左右节点入队,可以实现从左到右遍历,要实现每个节点值加入到对应层的数组,应该用for循环处理完队列中该层的节点数量,for循环之前队列中保存的是当前层的节点数量,for循环之后队列保存了下一层的节点数量。

参考题解

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        // write code here
        ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
        if (root == null) {
            return ret;
        }

        Queue<TreeNode> q = new ArrayDeque<>();
        q.offer(root);
        // 要用队列保存每一层的节点,而不是用栈,队列是先进先出结构,从左到右进队列,左边的节点先出队
        while(!q.isEmpty()) {
            ArrayList<Integer> row = new ArrayList<>();
            int n = q.size();  // 每一层都将当成队列的元素都取出

            for(int i = 0; i < n; ++i) {
                TreeNode current = q.poll();
                row.add(current.val);
                if (current.left != null) {
                    q.offer(current.left);
                }
                if (current.right != null) {
                    q.offer(current.right);
                }
            }
            // 将每一层的节点数组加入结果
            ret.add(row);
        } 
        return ret;
    }
}