public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > result = new ArrayList<>();
        if (pRoot == null) {
            return result;
        }
        // 开辟一个双端队列,方便后面操作
        Deque<TreeNode>queue = new LinkedList<>();
        // odd为true是奇数行
        boolean odd = true;

        queue.addFirst(pRoot);
        while (!queue.isEmpty()) {
            ArrayList<Integer> array = new ArrayList<>();
            int size = queue.size();
            // 单数行
            if (odd) {
                for (int i=0; i<size; ++i) {
                    // 从队列开头取结点
                    TreeNode node = queue.pollFirst();
                    array.add(node.val);
                    // 下一行是从右往左
                    // 所以左结点先addLast,最终会在队列开头
                    if (node.left != null) {
                        queue.addLast(node.left);
                    }
                    if (node.right != null) {
                        queue.addLast(node.right);
                    }                    
                }
            } else {
            // 双数行
                for (int i=0; i<size; ++i) {
                    // 从队列末尾取结点
                    TreeNode node = queue.pollLast();
                    array.add(node.val);
                    // 下一行是从左往右
                    // 所以右结点先addFirst,最终会在队列末尾
                    if (node.right != null) {
                        queue.addFirst(node.right);
                    }
                    if (node.left != null) {
                        queue.addFirst(node.left);
                    }                  
                }
            }
            result.add(array);
            // 下一行反过来
            odd = !odd;
        }
        return result;
    }