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).
Example
用BFS遍历节点。BFS可以用队列实现。 与正常BFS遍历不同的是,每次遇到dummy,则记录水平遍历方向。此后根据该遍历方向,决定向arraylist插入数值时是按顺序插入(正序),还是每次都从index=0插入(逆序)
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] ]
缺点是复杂度受arraylist插入算法复杂度影响。add(index, element)的实现是,依次后移所有在index以后的元素。因此复杂度为O(n)。因此整体复杂度约为O(n*n)
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: A list of lists of integer include
* the zigzag level order traversal of its nodes' values
*/
public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
LinkedList<TreeNode> list = new LinkedList<TreeNode>();
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(root == null) return res;
TreeNode dummy = new TreeNode(0);
list.add(root);
list.add(dummy);
ArrayList<Integer> inner = new ArrayList<Integer>();
inner.add(root.val);
res.add(inner);
inner = new ArrayList<Integer>();
boolean turn = true;
while(list.size() != 1) {
TreeNode tmp = list.poll();
if(tmp.val == 0) {
turn = !turn;
res.add(inner);
inner = new ArrayList<Integer>();
list.add(tmp);
}
if(tmp.left != null) {
list.add(tmp.left);
if(turn) inner.add(0, tmp.left.val);
else inner.add(tmp.left.val);
}
if(tmp.right != null) {
list.add(tmp.right);
if(turn) inner.add(0, tmp.right.val);
else inner.add(tmp.right.val);
}
}
return res;
}
}