import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        ArrayList<Integer> curList = new ArrayList<>();
        
        // 用于记录当前层的节点个数
        int curNum = 1;
        // 用于记录下一层的节点个数
        int nextNum = 0;
        // write code here
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offerLast(root);
        while (queue.size() > 0) {
            TreeNode poll = queue.pollFirst();
            curList.add(poll.val);
            curNum--;
            if (poll.left != null) {
                queue.offerLast(poll.left);
                nextNum++;
            }
            if (poll.right != null) {
                queue.offerLast(poll.right);
                nextNum++;
            }
            if (curNum == 0) {
                // update
                curNum = nextNum;
                nextNum = 0;
                list.add(curList);
                curList = new ArrayList<>();
            }
        }
        
        return list;
    }
}