import java.util.ArrayList;
import java.util.*;

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

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
// 层次遍历使用队列
// 难点在于如何划分层次:进入每一个层次之前,先统计一下队列长度
// 每层顺序不同:反转数组
// 时空复杂度:O(n)
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
    	// 初始化数组、队列、变量,加入根节点
        Queue<TreeNode> q = new LinkedList<>();
        ArrayList<ArrayList<Integer>> outlist = new ArrayList<>();
        if (pRoot == null)
            return outlist;
        q.add(pRoot);
        int num = q.size();
        boolean reverse = false;
        // 终止条件:结束上一层遍历时,队列长度为0
        while (num != 0){
            ArrayList<Integer> inlist = new ArrayList<>();
            for (int i = 0; i < num; i++){
                TreeNode node = q.poll();
                inlist.add(node.val);
                if (node.left != null)
                    q.add(node.left);
                if (node.right != null)
                    q.add(node.right);
            }
            num = q.size();
            if (reverse == true){
                reverse = false;
                Collections.reverse(inlist);
            }
            else
                reverse = true;
            outlist.add(inlist);
        }
        return outlist;
    }

}