57、按之字形顺序打印二叉树 一、题目 二、解法

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

二、解法

 1 import java.util.ArrayList;
 2 import java.util.LinkedList;
 3 import java.util.Queue;
 4 import java.util.Stack;
 5 
 6 /*
 7 public class TreeNode {
 8     int val = 0;
 9     TreeNode left = null;
10     TreeNode right = null;
11 
12     public TreeNode(int val) {
13         this.val = val;
14 
15     }
16 
17 }
18 */
19 public class Solution {
20     public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
21          ArrayList<ArrayList<Integer>> result = 
22                 new ArrayList<ArrayList<Integer>>();//返回结果
23         Queue<TreeNode> data = new LinkedList<TreeNode>();//保存树节点
24         if (pRoot == null)
25             return result;
26         data.add(pRoot);//添加根节点
27         boolean isReverse = true;//按照层序之字形
28         Stack<TreeNode> stack = new Stack<TreeNode>();
29         while (!data.isEmpty()) {
30             ArrayList<Integer> oneLine = new ArrayList<Integer>();//保存一行结果
31             int p = 0,size = data.size();
32             while (p++ < size) {
33                 TreeNode t = data.poll();
34                 if (isReverse)
35                     oneLine.add(t.val);
36                 else
37                     stack.push(t);
38                 if (t.left != null)
39                     data.add(t.left);
40                 if (t.right != null)
41                     data.add(t.right);
42             }
43             isReverse = !isReverse;
44             if(!stack.isEmpty()){
45                 while(!stack.isEmpty())
46                     oneLine.add(stack.pop().val);
47             }
48             result.add(oneLine);
49         }
50         return result;
51     }
52 
53 }