Description

Maximum Depth of Binary Tree
Given the root of a binary tree, return its maximum depth.

A binary tree’s maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

Example 1:

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

Example 2:
Input: root = [1,null,2] **Output:** 2

Constraints:

  • The number of nodes in the tree is in the range [0, 104].
  • -100 <= Node.val <= 100

Approach - BFS

  • We use queue which uses linked lists, we start by adding the root node then go BFS
  • We check how long it takes to reach the end
  • Time: O(n) Space: O(n)
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        Queue<TreeNode> q = new LinkedList<>();
        if (root != null) q.add(root); //tp kickstart
        int l = 0;
        while (!q.isEmpty()) {
            int size = q.size(); //use this instead direclty in for loop because the queue size will be altered inside the loop
            for (int i = 0; i < size; i++) {
                TreeNode n = q.poll(); // npt only removes but returns
                if (n.left != null) q.add(n.left);
                if (n.right != null) q.add(n.right);
            }
            l++;
        }
        return l;
    }
}

Approach - Recursion

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 * int val;
 * TreeNode left;
 * TreeNode right;
 * TreeNode() {}
 * TreeNode(int val) { this.val = val; }
 * TreeNode(int val, TreeNode left, TreeNode right) {
 * this.val = val;
 * this.left = left;
 * this.right = right;
 * }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null)
            return 0;
        return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
    }
}

Approach 1: Recursive DFS ( Time, Space)

Intuition

The maximum depth of a binary tree is plus the maximum depth between its left and right subtrees.

  1. If the current node is null, return (base case).
  2. Recursively calculate the depth of root.left and root.right.
  3. Return 1 + Math.max(leftDepth, rightDepth).
class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;
 
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
 
        return 1 + Math.max(leftDepth, rightDepth);
    }
}
 

Complexity

  • Time Complexity: — Visits every node in the binary tree exactly once.
  • Space Complexity: worst-case call stack depth for a skewed tree ( for a balanced tree).

Approach 2: BFS Level-Order Traversal ( Time, Space)

Intuition

Traverse the tree level by level using a queue (ArrayDeque).

  1. Add root to the queue before the loop.
  2. For each iteration of the while (!queue.isEmpty()) loop, increment a depth counter.
  3. Process all nodes at the current level (levelSize = queue.size()) and push their non-null children into the queue.
  4. Return depth once the queue is empty.
import java.util.ArrayDeque;
import java.util.Deque;
 
class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;
 
        Deque<TreeNode> queue = new ArrayDeque<>();
        queue.offer(root);
        int depth = 0;
 
        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            depth++;
 
            for (int i = 0; i < levelSize; i++) {
                TreeNode curr = queue.poll();
 
                if (curr.left != null) queue.offer(curr.left);
                if (curr.right != null) queue.offer(curr.right);
            }
        }
 
        return depth;
    }
}
 

Complexity

  • Time Complexity: — Every node is offered and polled from the queue once.
  • Space Complexity: — Maximum queue size is bounded by the widest level of the tree (up to nodes).

Easy Memory Rule

“DFS: 1 + Math.max(maxDepth(left), maxDepth(right)) OR BFS: Increment depth once per level in standard queue loop!”