Binary Tree Zigzag Level Order Traversal

Medium Trees & BST Traversals Original on LeetCode

Binary Tree Zigzag Level Order Traversal is a medium trees & bst problem solved with the traversals pattern. The best approach, fill each level in place (deque per level), runs in O(n) time and O(w) space. Below are 2 approaches in Java, from level order, reverse odd levels up.

Problem

Return the level order traversal of a binary tree in zigzag order: the first level left to right, the next right to left, and so on.

Examples

Example 1

Input
root = [3, 9, 20, null, null, 15, 7]
Output
[[3], [20, 9], [15, 7]]

Example 2

Input
root = [1, 2, 3, 4, null, null, 5]
Output
[[1], [3, 2], [4, 5]]

Constraints

  • The tree has 0 to 2000 nodes.

Animated walkthrough

A narrated, step-by-step animation that builds the solution from the idea up. Press play, or step through it at your own pace.

Concepts first, then the problem and every approach, step by step.

Space to play or pause · ← → to jump a step · click or drag the bar to seek

Solutions

Try it yourself first. Then compare: each approach lists its idea, the steps, its time and space, and the Java code.

ApproachTimeSpace
Level order, reverse odd levelsO(n)O(w)
Fill each level in place (deque per level)O(n)O(w)

1Level order, reverse odd levels

TimeO(n)
SpaceO(w)

Run normal BFS and reverse every second level's list.

  1. BFS by level; if the level index is odd, Collections.reverse(level).
Java
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> out = new ArrayList<>();
        if (root == null) return out;
        Queue<TreeNode> q = new ArrayDeque<>();
        q.add(root);
        while (!q.isEmpty()) {
            List<Integer> level = new ArrayList<>();
            for (int i = q.size(); i > 0; i--) {
                TreeNode n = q.poll();
                level.add(n.val);
                if (n.left != null) q.add(n.left);
                if (n.right != null) q.add(n.right);
            }
            if (out.size() % 2 == 1) Collections.reverse(level);
            out.add(level);
        }
        return out;
    }
}

2Fill each level in place (deque per level)

TimeO(n)
SpaceO(w)

Know the level size in advance, so put each value directly at index i (left to right) or size - 1 - i (right to left). No reverse step.

  1. size = q.size(); Integer[] level = new Integer[size].
  2. For the i-th polled node: idx = leftToRight ? i : size - 1 - i.
  3. Flip leftToRight after each level.
Java
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> out = new ArrayList<>();
        if (root == null) return out;
        Queue<TreeNode> q = new ArrayDeque<>();
        q.add(root);
        boolean leftToRight = true;
        while (!q.isEmpty()) {
            int size = q.size();
            Integer[] level = new Integer[size];
            for (int i = 0; i < size; i++) {
                TreeNode n = q.poll();
                level[leftToRight ? i : size - 1 - i] = n.val;
                if (n.left != null) q.add(n.left);
                if (n.right != null) q.add(n.right);
            }
            out.add(Arrays.asList(level));
            leftToRight = !leftToRight;
        }
        return out;
    }
}

Edge cases to test

  • Empty tree
  • A single path

Hints

Hint 1

Do a normal level order, but write each level's values into the list from the front on odd levels.

FAQ

What is the best time complexity for Binary Tree Zigzag Level Order Traversal?

Fill each level in place (deque per level) runs in O(n) time and O(w) extra space.

Which pattern does Binary Tree Zigzag Level Order Traversal use?

It is a trees & bst problem that uses the traversals pattern. Other problems with the same pattern: Binary Tree Level Order Traversal, Binary Tree Level Order Traversal II.

Is there a brute force solution for Binary Tree Zigzag Level Order Traversal?

Yes. Level order, reverse odd levels takes O(n) time and O(w) space. Run normal BFS and reverse every second level's list.

Which edge cases should I test for Binary Tree Zigzag Level Order Traversal?

Empty tree; A single path.