这个题目我觉得是BFS的扩展,我只是对偶数层的节点先放到一个栈中,这样从栈出来后就换了一个顺序。
下面是AC代码:
1 /** 2 *Given a binary tree, return the zigzag level order traversal of its nodes' values. *(ie, from left to right, then right to left for the next level and alternate between). 3 * 4 **/ 5 public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root){ 6 ArrayList<ArrayList<Integer>> r = new ArrayList<ArrayList<Integer>>(); 7 if(root == null) 8 return r; 9 //for BFS 10 LinkedList<TreeNode> queue = new LinkedList<TreeNode>(); 11 // to record the level information 12 LinkedList<Integer> level = new LinkedList<Integer>(); 13 // to reverse the order 14 LinkedList<Integer> stack = null; 15 ArrayList<Integer> sub = null; 16 queue.offer(root); 17 level.offer(1); 18 int last = -1; 19 while(!queue.isEmpty()){ 20 TreeNode cur = queue.poll(); 21 int la = level.poll(); 22 //135... directly put into an array 23 if(la!=last && la%2 == 1){ 24 //put the last level into the total result; 25 if(stack!=null){ 26 ArrayList<Integer> rs = new ArrayList<Integer>(); 27 while(!stack.isEmpty()) 28 rs.add(stack.pop()); 29 r.add(rs); 30 } 31 sub = new ArrayList<Integer>(); 32 sub.add( cur.val); 33 }else if(la!=last && la%2 == 0){ 34 //put the last level into the total result 35 if(sub!=null) 36 r.add(sub); 37 stack = new LinkedList<Integer>(); 38 stack.push(cur.val); 39 }else if(la == last && la%2 == 1){ 40 sub.add(cur.val); 41 }else if(la == last && la%2 == 0){ 42 stack.push(cur.val); 43 } 44 if(cur.left != null){ 45 queue.offer(cur.left); 46 level.offer(la+1); 47 } 48 if(cur.right != null){ 49 queue.offer(cur.right); 50 level.offer(la+1); 51 } 52 last = la; 53 } 54 //put the last level into the total result 55 if(last%2 == 1) 56 r.add(sub); 57 else{ 58 ArrayList<Integer> rs = new ArrayList<Integer>(); 59 while(!stack.isEmpty()) 60 rs.add(stack.pop()); 61 r.add(rs); 62 } 63 return r; 64 }