Skip to main content

Binary Tree Zigzag Level Order Traversal

Given a binary tree, return its zigzag level order traversal. (i.e., from left to right, then right to left for the next level and alternate between).

Example(s)

Example 1:

Tree:
1
/ \
2 3
Output: [[1],[3,2]]

Example 2:

Tree:
8
/ \
2 29
/ \
3 9
Output: [[8],[29,2],[3,9]]

Solution

JavaScript Zigzag Level Order Traversal Solution


/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
*     this.val = (val===undefined ? 0 : val)
*     this.left = (left===undefined ? null : left)
*     this.right = (right===undefined ? null : right)
* }
*/

/**
* Perform zigzag level order traversal of a binary tree
* @param {TreeNode} root - Root of the binary tree
* @return {number[][]} - Zigzag level order traversal result
*/
function zigzagLevelOrder(root) {
if (!root) return [];

const result = [];
const queue = [root];
let leftToRight = true;

while (queue.length) {
  const levelSize = queue.length;
  const currentLevel = [];
  
  for (let i = 0; i < levelSize; i++) {
    const node = queue.shift();
    currentLevel.push(node.val);
    if (node.left) queue.push(node.left);
    if (node.right) queue.push(node.right);
  }
  
  if (!leftToRight) {
    currentLevel.reverse();
  }
  
  result.push(currentLevel);
  leftToRight = !leftToRight;
}

return result;
}

// Test case 1: [1,2,3]
const tree1 = new TreeNode(1);
tree1.left = new TreeNode(2);
tree1.right = new TreeNode(3);

// Test case 2: [8,2,29,null,null,3,9]
const tree2 = new TreeNode(8);
tree2.left = new TreeNode(2);
tree2.right = new TreeNode(29);
tree2.right.left = new TreeNode(3);
tree2.right.right = new TreeNode(9);

// Test cases
console.log(zigzagLevelOrder(tree1)); // [[1],[3,2]]
console.log(zigzagLevelOrder(tree2)); // [[8],[29,2],[3,9]]
console.log(zigzagLevelOrder(null)); // []
Output:
Click "Run Code" to execute the code and see the results.

Complexity

  • Time Complexity: O(n) - Where n is the number of nodes in the tree
  • Space Complexity: O(w) - Where w is the maximum width of the tree

Approach

The solution uses a breadth-first search (BFS) approach:

  1. Level-by-level traversal using a queue
  2. Track level size to process all nodes at each level
  3. Toggle direction between left-to-right and right-to-left
  4. Reverse level when going right-to-left
  5. Return array of arrays representing each level

Key Insights

  • Breadth-first search ensures level-by-level traversal
  • Queue data structure efficiently processes nodes in order
  • Direction toggle alternates between left-to-right and right-to-left per level
  • Edge cases include empty tree, single-node tree, and single-level trees
  • O(n) time is optimal as all nodes must be visited