1. 程式人生 > >請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

 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;