class TreeNode { int val; TreeNode left, right; TreeNode(int x) { val = x; } } // Tree structure: // 1 // / \ // 2 3 // / \ // 4 5 public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<>(); if (root == null) return result; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); boolean leftToRight = true; while (!queue.isEmpty()) { int size = queue.size(); LinkedList<Integer> level = new LinkedList<>(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); if (leftToRight) { level.addLast(node.val); } else { level.addFirst(node.val); } if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); } result.add(level); leftToRight = !leftToRight; } return result; }
The traversal starts left to right at level 1: [1].
At level 2, it goes right to left: [3, 2].
At level 3, it goes left to right again: [4, 5].
class TreeNode { int val; TreeNode left, right; TreeNode(int x) { val = x; } } // Tree structure: // 10 public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<>(); if (root == null) return result; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); boolean leftToRight = true; while (!queue.isEmpty()) { int size = queue.size(); LinkedList<Integer> level = new LinkedList<>(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); if (leftToRight) { level.addLast(node.val); } else { level.addFirst(node.val); } if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); } result.add(level); leftToRight = !leftToRight; } return result; }
With only one node, the traversal returns a list with one list containing that node's value.
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean leftToRight = true;
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> level = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (leftToRight) {
level.add(node.val);
} else {
level.add(0, node.val);
}
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
result.add(level);
leftToRight = !leftToRight;
}
return result;
}The code uses ArrayList and inserts at index 0 when traversing right to left. This works correctly but is less efficient.
No exceptions occur for normal input.
LinkedList allows efficient insertion at both ends (front and back) which is needed for zigzag traversal.
ArrayList is inefficient for front insertions.
HashSet and Stack do not support ordered insertion at both ends.
A complete binary tree with 7 nodes has height 3 (levels 1, 2, and 3).
Each level corresponds to one list in the output.
