Maximum Depth of a Binary Tree: DFS in Four Lines
This one is a Easy-rated classic reported from Amazon, Google, Apple interviews: "Maximum Depth of Binary Tree". Like every post in this series, the goal is not memorizing the answer — it is recognizing the Tree DFS pattern on sight. Part 1 of 11 in the Tree DFS arc.
The Problem
Return the maximum depth — the number of nodes on the longest path from root to leaf. Everyone solves it; the interview value is how you frame it, because the framing (a subtree's answer from its children's answers) scales to genuinely hard questions like Maximum Path Sum.
Input: root = [3, 9, 20, None, None, 15, 7]
Output: 3
Recognizing the Tree DFS Pattern
Depth-first search commits to one branch before trying siblings — recursion (or an explicit stack) whose call structure mirrors the tree itself. Its natural questions are about paths (root to leaf), subtree properties (computed bottom-up from children), and exhaustive exploration (islands, connected regions). The recurring design decision is what each recursive call returns versus what it accumulates in shared state.
Depth of a tree is one plus the larger child depth, with the empty tree contributing zero — a property defined recursively on subtrees. When the definition is recursive, the DFS is the definition transcribed.
The Approach
Base case: None has depth 0. Recursive case: 1 + max(depth(left), depth(right)). State it, write it, and add the two things interviewers push on: the recursion depth equals tree height (O(n) stack on a degenerate chain), and the iterative rewrite uses an explicit stack of (node, depth) pairs.
For a warm-up like this, volunteering the recursion-limit caveat in Python (default around 1000) converts a trivial answer into a memorable one.
Python Solution
class TreeNode:
def __init__(self, val: int = 0, left: "TreeNode | None" = None,
right: "TreeNode | None" = None):
self.val = val
self.left = left
self.right = right
def max_depth(root: TreeNode | None) -> int:
"""Nodes on the longest root-to-leaf path."""
if root is None:
return 0
return 1 + max(max_depth(root.left), max_depth(root.right))
Complexity
- Time: O(n) — every node is visited once
- Space: O(h) — recursion stack equals tree height — O(log n) balanced, O(n) degenerate
Interview Tips and Follow-Ups
- Say O(h), not O(log n), for stack space unless the tree is stated balanced — precision here is a known calibration point.
- Iterative version: stack of (node, depth) with a running max — write it once so it is available when an interviewer bans recursion.
- Contrast with Minimum Depth (BFS arc): max needs the whole tree, min rewards early exit. Choosing the traversal per problem is the actual skill.
More Tree DFS problems — and the other eight patterns — live in the Technical Interview category. Drill the pattern, not the problem: that is the entire thesis of this series.
Keep reading
Binary Tree Maximum Path Sum: The Hard Version of Diameter
Any-to-any max path — clamp negative arms to zero and track the bend. Python solution and complexity analysis for the DFS interview pattern.
Diameter of a Binary Tree: Answers That Bypass the Root
Return one thing, track another — the two-quantity DFS shape. Python solution and complexity analysis for the DFS interview pattern.
Invert Binary Tree: Swap on the Way Down
The famous swap-children recursion — and its iterative twin. Python solution and complexity analysis for the DFS interview pattern.
Lowest Common Ancestor: The Bubble Up Argument
Return what you found — the split node emerges from the recursion. Python solution and complexity analysis for the DFS interview pattern.
Number of Islands: Flood Fill as Component Counting
The most-asked grid question — sink each island as you count it. Python solution and complexity analysis for the DFS interview pattern.
Path Sum II: Backtracking With a Shared Path Buffer
Collect all matching root-to-leaf paths — append, recurse, pop. Python solution and complexity analysis for the DFS interview pattern.
Newsletter
New posts, straight to your inbox
One email per post. No spam, no tracking pixels, unsubscribe anytime.
Comments
- No comments yet. Be the first.