import java.util.ArrayList;
import java.util.Stack;

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

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

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        //特殊值(空指针)处理
        if(pRoot == null){
            return new ArrayList<ArrayList<Integer>>();
        }
        
        ArrayList<ArrayList<Integer>> array = new ArrayList<ArrayList<Integer> >();//创建一个链表
        Stack<TreeNode> stack1 = new Stack<>();//创建一个栈1,栈1存放二叉树的奇数层节点
        Stack<TreeNode> stack2 = new Stack<>();//创建一个栈2,栈2存放二叉树的偶数层节点
        stack1.push(pRoot);//将根节点压入栈1
        //遍历二叉树
        while(stack1.empty() == false || stack2.empty() == false){
            ArrayList<Integer> arr = new ArrayList<>();
            //遍历栈1,将栈1中的节点的儿子节点从左向右压入栈2
            while(!stack1.empty()){
                TreeNode treeNode = stack1.pop();//从栈1中弹出头结点
                arr.add(treeNode.val);//将遍历栈1的元素节点的值添加到临时链表中
                //将栈1中的节点的儿子节点从左向右压入栈2
                if(treeNode.left != null){//先压入左儿子节点
                    stack2.push(treeNode.left);
                }
                if(treeNode.right != null){//后压入右儿子节点
                    stack2.push(treeNode.right);
                }
            }
            //每遍历一次栈,都要将临时链表压入链表中
            if(arr.size() != 0){
                array.add(arr);
                continue;//栈1和栈2不可能同时有值
            }
            //遍历栈2,将栈2中的节点的儿子节点从右向左压入栈1
            while(!stack2.empty()){
                TreeNode treeNode = stack2.pop();//从栈2中弹出头结点
                arr.add(treeNode.val);//将遍历栈1的元素节点的值添加到临时链表中
                //将栈2中的节点的儿子节点从右向左压入栈2
                if(treeNode.right != null){//先压入右儿子节点
                    stack1.push(treeNode.right);
                }
                if(treeNode.left != null){//后压入左儿子节点
                    stack1.push(treeNode.left);
                }
            }
            array.add(arr);//每遍历一次栈,都要将临时链表压入链表中
        }
        
        
        return array;
    }

}