DEV Community

Jaspreet singh
Jaspreet singh

Posted on

Maximum Width of Binary Tree

Given the root of a binary tree, return the **## Problem Statement

Given the root of a binary tree, return the maximum width of the tree.

The width of a level is defined as:

Distance between the leftmost
and rightmost non-null nodes
(including null nodes in between).
Enter fullscreen mode Exit fullscreen mode

Brute Force Intuition

In an interview, you can explain it like this:

Perform a level-order traversal and count the number of nodes at each level.

However, this is incorrect because missing (null) nodes between two existing nodes also contribute to the width.

Example:

        1
       / \
      2   3
     /     \
    4       5
Enter fullscreen mode Exit fullscreen mode

Level 3 has only two nodes,

but its width is:

4
Enter fullscreen mode Exit fullscreen mode

not 2.


Complexity

  • Time Complexity: O(N)
  • Space Complexity: O(N)

Moving Towards the Optimal Approach

Treat the binary tree as if it were stored in an array.

Assign every node an index.

Rules:

Root → 0
Enter fullscreen mode Exit fullscreen mode

For every node:

Left Child

↓

2 * index + 1
Enter fullscreen mode Exit fullscreen mode
Right Child

↓

2 * index + 2
Enter fullscreen mode Exit fullscreen mode

Now,

Width of a level becomes:

Last Index

-

First Index

+

1
Enter fullscreen mode Exit fullscreen mode

Pattern Recognition

Whenever you see:

  • Width of Binary Tree
  • Complete Binary Tree Positioning

Think:

Level Order Traversal + Indexing


Key Observation

Store inside the queue:

(Node, Index)
Enter fullscreen mode Exit fullscreen mode

For every level:

First Index

↓

Last Index
Enter fullscreen mode Exit fullscreen mode

Width:

last - first + 1;
Enter fullscreen mode Exit fullscreen mode

To prevent integer overflow,

normalize indices at every level.


Optimal Approach

Step 1

Perform BFS.

Queue stores:

(Node, Index)
Enter fullscreen mode Exit fullscreen mode

Step 2

For every level,

store:

Minimum Index
Enter fullscreen mode Exit fullscreen mode

Subtract it from every index.

This keeps numbers small.


Step 3

Track:

First Index

↓

Last Index
Enter fullscreen mode Exit fullscreen mode

Step 4

Update answer:

last - first + 1;
Enter fullscreen mode Exit fullscreen mode

Optimal Java Solution

class Pair {

    TreeNode node;
    int index;

    Pair(TreeNode node, int index) {

        this.node = node;
        this.index = index;
    }
}

class Solution {

    public int widthOfBinaryTree(TreeNode root) {

        if (root == null)
            return 0;

        Queue<Pair> q = new LinkedList<>();

        q.offer(new Pair(root, 0));

        int ans = 0;

        while (!q.isEmpty()) {

            int size = q.size();

            int minIndex = q.peek().index;

            int first = 0;
            int last = 0;

            for (int i = 0; i < size; i++) {

                Pair curr = q.poll();

                int index = curr.index - minIndex;

                if (i == 0)
                    first = index;

                if (i == size - 1)
                    last = index;

                if (curr.node.left != null)

                    q.offer(new Pair(
                        curr.node.left,
                        2 * index + 1));

                if (curr.node.right != null)

                    q.offer(new Pair(
                        curr.node.right,
                        2 * index + 2));
            }

            ans = Math.max(ans,
                           last - first + 1);
        }

        return ans;
    }
}
Enter fullscreen mode Exit fullscreen mode

Dry Run

          1
        /   \
       2     3
      /       \
     4         5
Enter fullscreen mode Exit fullscreen mode

Assign indices:

          0
        /   \
       1     2
      /       \
     3         6
Enter fullscreen mode Exit fullscreen mode

Level 1

Indices:

0
Enter fullscreen mode Exit fullscreen mode

Width:

1
Enter fullscreen mode Exit fullscreen mode

Level 2

Indices:

1

2
Enter fullscreen mode Exit fullscreen mode

Width:

2
Enter fullscreen mode Exit fullscreen mode

Level 3

Indices:

3

6
Enter fullscreen mode Exit fullscreen mode

Width:

6 - 3 + 1

=

4
Enter fullscreen mode Exit fullscreen mode

Answer:

4
Enter fullscreen mode Exit fullscreen mode

Why Indexing Works?

The assigned indices represent the positions of nodes in a complete binary tree.

Even if some nodes are missing,

their positions are preserved.

Thus,

Last Index

-

First Index

+

1
Enter fullscreen mode Exit fullscreen mode

correctly measures the actual width.


Complexity Analysis

Metric Complexity
Time Complexity O(N)
Space Complexity O(N)

Interview One-Liner

Perform a level-order traversal while assigning complete binary tree indices to each node. The width of each level is the difference between the first and last indices plus one.


Pattern Learned

Level Order

↓

Assign Indices

↓

First Index

↓

Last Index

↓

Maximum Width
Enter fullscreen mode Exit fullscreen mode

Similar Problems

  • Maximum Width of Binary Tree
  • Complete Binary Tree
  • Left View
  • Right View
  • Vertical Order Traversal

Memory Trick

Think:

Root → 0

↓

Left = 2i + 1

↓

Right = 2i + 2

↓

Width

=

Last - First + 1
Enter fullscreen mode Exit fullscreen mode

Mental Model

BFS

↓

(Node, Index)

↓

Track First & Last

↓

Update Maximum Width
Enter fullscreen mode Exit fullscreen mode

Whenever you hear:

"Maximum Width of Binary Tree"

your brain should immediately think:

Level Order Traversal + Complete Binary Tree Indexing .

The width of a level is defined as:

Distance between the leftmost
and rightmost non-null nodes
(including null nodes in between).
Enter fullscreen mode Exit fullscreen mode

Brute Force Intuition

In an interview, you can explain it like this:

Perform a level-order traversal and count the number of nodes at each level.

However, this is incorrect because missing (null) nodes between two existing nodes also contribute to the width.

Example:

        1
       / \
      2   3
     /     \
    4       5
Enter fullscreen mode Exit fullscreen mode

Level 3 has only two nodes,

but its width is:

4
Enter fullscreen mode Exit fullscreen mode

not 2.


Complexity

  • Time Complexity: O(N)
  • Space Complexity: O(N)

Moving Towards the Optimal Approach

Treat the binary tree as if it were stored in an array.

Assign every node an index.

Rules:

Root → 0
Enter fullscreen mode Exit fullscreen mode

For every node:

Left Child

↓

2 * index + 1
Enter fullscreen mode Exit fullscreen mode
Right Child

↓

2 * index + 2
Enter fullscreen mode Exit fullscreen mode

Now,

Width of a level becomes:

Last Index

-

First Index

+

1
Enter fullscreen mode Exit fullscreen mode

Pattern Recognition

Whenever you see:

  • Width of Binary Tree
  • Complete Binary Tree Positioning

Think:

Level Order Traversal + Indexing


Key Observation

Store inside the queue:

(Node, Index)
Enter fullscreen mode Exit fullscreen mode

For every level:

First Index

↓

Last Index
Enter fullscreen mode Exit fullscreen mode

Width:

last - first + 1;
Enter fullscreen mode Exit fullscreen mode

To prevent integer overflow,

normalize indices at every level.


Optimal Approach

Step 1

Perform BFS.

Queue stores:

(Node, Index)
Enter fullscreen mode Exit fullscreen mode

Step 2

For every level,

store:

Minimum Index
Enter fullscreen mode Exit fullscreen mode

Subtract it from every index.

This keeps numbers small.


Step 3

Track:

First Index

↓

Last Index
Enter fullscreen mode Exit fullscreen mode

Step 4

Update answer:

last - first + 1;
Enter fullscreen mode Exit fullscreen mode

Optimal Java Solution

class Pair {

    TreeNode node;
    int index;

    Pair(TreeNode node, int index) {

        this.node = node;
        this.index = index;
    }
}

class Solution {

    public int widthOfBinaryTree(TreeNode root) {

        if (root == null)
            return 0;

        Queue<Pair> q = new LinkedList<>();

        q.offer(new Pair(root, 0));

        int ans = 0;

        while (!q.isEmpty()) {

            int size = q.size();

            int minIndex = q.peek().index;

            int first = 0;
            int last = 0;

            for (int i = 0; i < size; i++) {

                Pair curr = q.poll();

                int index = curr.index - minIndex;

                if (i == 0)
                    first = index;

                if (i == size - 1)
                    last = index;

                if (curr.node.left != null)

                    q.offer(new Pair(
                        curr.node.left,
                        2 * index + 1));

                if (curr.node.right != null)

                    q.offer(new Pair(
                        curr.node.right,
                        2 * index + 2));
            }

            ans = Math.max(ans,
                           last - first + 1);
        }

        return ans;
    }
}
Enter fullscreen mode Exit fullscreen mode

Dry Run

          1
        /   \
       2     3
      /       \
     4         5
Enter fullscreen mode Exit fullscreen mode

Assign indices:

          0
        /   \
       1     2
      /       \
     3         6
Enter fullscreen mode Exit fullscreen mode

Level 1

Indices:

0
Enter fullscreen mode Exit fullscreen mode

Width:

1
Enter fullscreen mode Exit fullscreen mode

Level 2

Indices:

1

2
Enter fullscreen mode Exit fullscreen mode

Width:

2
Enter fullscreen mode Exit fullscreen mode

Level 3

Indices:

3

6
Enter fullscreen mode Exit fullscreen mode

Width:

6 - 3 + 1

=

4
Enter fullscreen mode Exit fullscreen mode

Answer:

4
Enter fullscreen mode Exit fullscreen mode

Why Indexing Works?

The assigned indices represent the positions of nodes in a complete binary tree.

Even if some nodes are missing,

their positions are preserved.

Thus,

Last Index

-

First Index

+

1
Enter fullscreen mode Exit fullscreen mode

correctly measures the actual width.


Complexity Analysis

Metric Complexity
Time Complexity O(N)
Space Complexity O(N)

Interview One-Liner

Perform a level-order traversal while assigning complete binary tree indices to each node. The width of each level is the difference between the first and last indices plus one.


Pattern Learned

Level Order

↓

Assign Indices

↓

First Index

↓

Last Index

↓

Maximum Width
Enter fullscreen mode Exit fullscreen mode

Similar Problems

  • Maximum Width of Binary Tree
  • Complete Binary Tree
  • Left View
  • Right View
  • Vertical Order Traversal

Memory Trick

Think:

Root → 0

↓

Left = 2i + 1

↓

Right = 2i + 2

↓

Width

=

Last - First + 1
Enter fullscreen mode Exit fullscreen mode

Mental Model

BFS

↓

(Node, Index)

↓

Track First & Last

↓

Update Maximum Width
Enter fullscreen mode Exit fullscreen mode

Whenever you hear:

"Maximum Width of Binary Tree"

your brain should immediately think:

Level Order Traversal + Complete Binary Tree Indexing

Top comments (0)