Binary Tree Zigzag Level Order Traversal
Solution 1
We could borrow the solution from Binary Tree Level Order with minor modification by having a boolean value to check if we need to reverse the list.
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList();
if (root == null) return result;
Queue<TreeNode> current = new LinkedList<TreeNode>();
Queue<TreeNode> next = new LinkedList<TreeNode>();
current.offer(root);
List<Integer> currentLevel = new ArrayList();
boolean needChangeOrder = false;
while (!current.isEmpty()) {
TreeNode node = current.poll();
currentLevel.add(node.val);
if (node.left != null) {
next.offer(node.left);
}
if (node.right != null) {
next.offer(node.right);
}
if (current.isEmpty()) {
if (needChangeOrder) {
Collections.reverse(currentLevel);
needChangeOrder = false;
} else {
needChangeOrder = true;
}
result.add(new ArrayList(currentLevel));
currentLevel = new ArrayList();
current = next;
next = new LinkedList<TreeNode>();
}
}
return result;
}
Solution 2 : using stack and a boolean flag
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList();
if (root == null) return result;
Stack<TreeNode> current = new Stack<TreeNode>();
Stack<TreeNode> next = new Stack<TreeNode>();
current.push(root);
List<Integer> currentLevel = new ArrayList();
boolean needChangeOrder = false;
while (!current.isEmpty()) {
TreeNode node = current.pop();
currentLevel.add(node.val);
if (needChangeOrder) {
if (node.right != null) {
next.push(node.right);
}
if (node.left != null) {
next.push(node.left);
}
} else {
if (node.left != null) {
next.push(node.left);
}
if (node.right != null) {
next.push(node.right);
}
}
if (current.isEmpty()) {
needChangeOrder = !needChangeOrder;
result.add(new ArrayList(currentLevel));
currentLevel = new ArrayList();
current = next;
next = new Stack<TreeNode>();
}
}
return result;
}