请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其余行以此类推。

 boolean flag1 = true ;                   //利用标志位来控制顺序,为true,则从左到右的顺序,为false则相反
         
           Stack<TreeNode> s1 = new Stack<>();
           Stack<TreeNode> s2 = new Stack<>();     //利用两个栈的弹栈出栈,来模拟左右顺序
           
           ArrayList<ArrayList<Integer>> l1 = new ArrayList<>();
           if(pRoot == null)
               return l1;
           s1.push(pRoot);
           
           while((!s1.isEmpty()) || (!s2.isEmpty())) { //只要两个栈都不为空,则继续
               TreeNode p1 = null;
               if(flag1) {
                    p1 = s1.peek();                  //当为true时,则p1位s1的栈顶元素
               }else {
                    p1 = s2.peek();                  //当为false时,则p1位s2的栈顶元素
               }
               if(flag1) {
                   ArrayList<Integer> al = new ArrayList<>();     //定义新的数组存储从s1中弹栈的元素
                   while(!s1.isEmpty()) {
                   p1 = s1.pop();
                   if(p1.left != null)                          //而且按照先左子树,后右子树的顺序把从s1弹出的元素的左子树和右子树入栈s2
                   s2.push(p1.left);
                   if(p1.right != null)
                   s2.push(p1.right);
                   al.add(p1.val);
                   if(s1.isEmpty())
                       break;
                   p1 = s1.peek();
                   }
                   l1.add(al);                              //向数组中添加这次遍历的数组
                   flag1 = false ;                         //更改标志位
               }else {
                   ArrayList<Integer> al1 = new ArrayList<>();
                   while(!s2.isEmpty()) {
                   p1 = s2.pop();
                   if(p1.right != null)       //而且按照先右子树,后左子树的顺序把从s2弹出的元素的左子树和右子树入栈s1
                   s1.push(p1.right);
                   if(p1.left != null)
                   s1.push(p1.left);
                   al1.add(p1.val);
                   if(s2.isEmpty())
                       break;
                   p1 = s2.peek();
                   }
                   l1.add(al1);
                   flag1 = true ;
                }
             
           }
          /* for (TreeNode treeNode : al) {
            l1.add(treeNode.val);
           }
           return l1;*/
           return l1;数组