[leetcode]Binary Tree Zigzag Level Order Traversal
Binary Tree Zigzag Level Order Traversal
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).
For example:
Given binary tree{3,9,20,#,#,15,7}
,3 / \ 9 20 / \ 15 7
return its zigzag level order traversal as:
[ [3], [20,9], [15,7] ]
算法思路:
BFS,没什么好讲的,用一个boolean变量标记是正序还是逆序,逆序就用头插法,正序用尾插法。
代码如下:
1 public class Solution { 2 List<List<Integer>> res = new ArrayList<List<Integer>>(); 3 public List<List<Integer>> zigzagLevelOrder(TreeNode root) { 4 if(root == null) return res; 5 Queue<TreeNode> q = new LinkedList<TreeNode>(); 6 Queue<TreeNode> copy = new LinkedList<TreeNode>(); 7 q.offer(root); 8 res.add(new ArrayList<Integer>(Arrays.asList(root.val))); 9 boolean tag = false; 10 while(!q.isEmpty()){ 11 TreeNode tem = q.poll(); 12 if(tem.left != null) copy.offer(tem.left); 13 if(tem.right != null) copy.offer(tem.right); 14 if(q.isEmpty() && !copy.isEmpty()){ 15 List<Integer> list = new LinkedList<Integer>(); 16 if(tag){ 17 while(!copy.isEmpty()){ 18 q.add(copy.peek()); 19 list.add(copy.poll().val); 20 } 21 }else{ 22 while(!copy.isEmpty()){ 23 q.add(copy.peek()); 24 list.add(0, copy.poll().val); 25 } 26 } 27 res.add(list); 28 tag = !tag; 29 } 30 } 31 return res; 32 } 33 }
我用了两个queue来进行层次的区分,网上很多人很巧妙的用了一个null来表示一层的结束。请参考这里。