Forgetting null/base-case handling
Wrong move: Recursive traversal assumes children always exist.
Usually fails on: Leaf nodes throw errors or create wrong depth/path values.
Fix: Handle null/base cases before recursive transitions.
Build confidence with an intuition-first walkthrough focused on tree fundamentals.
Given a n-ary tree, find its maximum depth.
The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.
Nary-Tree input serialization is represented in their level order traversal, each group of children is separated by the null value (See examples).
Example 1:
Input: root = [1,null,3,2,4,null,5,6] Output: 3
Example 2:
Input: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14] Output: 5
Constraints:
[0, 104].1000.Problem summary: Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. Nary-Tree input serialization is represented in their level order traversal, each group of children is separated by the null value (See examples).
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Tree
[1,null,3,2,4,null,5,6]
[1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
maximum-depth-of-binary-tree)the-time-when-the-network-becomes-idle)count-the-number-of-good-nodes)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #559: Maximum Depth of N-ary Tree
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, List<Node> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public int maxDepth(Node root) {
if (root == null) {
return 0;
}
int mx = 0;
for (Node child : root.children) {
mx = Math.max(mx, maxDepth(child));
}
return 1 + mx;
}
}
// Accepted solution for LeetCode #559: Maximum Depth of N-ary Tree
/**
* Definition for a Node.
* type Node struct {
* Val int
* Children []*Node
* }
*/
func maxDepth(root *Node) int {
if root == nil {
return 0
}
mx := 0
for _, child := range root.Children {
mx = max(mx, maxDepth(child))
}
return 1 + mx
}
# Accepted solution for LeetCode #559: Maximum Depth of N-ary Tree
"""
# Definition for a Node.
class Node:
def __init__(self, val: Optional[int] = None, children: Optional[List['Node']] = None):
self.val = val
self.children = children
"""
class Solution:
def maxDepth(self, root: "Node") -> int:
if root is None:
return 0
mx = 0
for child in root.children:
mx = max(mx, self.maxDepth(child))
return 1 + mx
// Accepted solution for LeetCode #559: Maximum Depth of N-ary Tree
// Rust example auto-generated from java reference.
// Replace the signature and local types with the exact LeetCode harness for this problem.
impl Solution {
pub fn rust_example() {
// Port the logic from the reference block below.
}
}
// Reference (java):
// // Accepted solution for LeetCode #559: Maximum Depth of N-ary Tree
// /*
// // Definition for a Node.
// class Node {
// public int val;
// public List<Node> children;
//
// public Node() {}
//
// public Node(int _val) {
// val = _val;
// }
//
// public Node(int _val, List<Node> _children) {
// val = _val;
// children = _children;
// }
// };
// */
//
// class Solution {
// public int maxDepth(Node root) {
// if (root == null) {
// return 0;
// }
// int mx = 0;
// for (Node child : root.children) {
// mx = Math.max(mx, maxDepth(child));
// }
// return 1 + mx;
// }
// }
// Accepted solution for LeetCode #559: Maximum Depth of N-ary Tree
/**
* Definition for _Node.
* class _Node {
* val: number
* children: _Node[]
*
* constructor(val?: number, children?: _Node[]) {
* this.val = (val===undefined ? 0 : val)
* this.children = (children===undefined ? [] : children)
* }
* }
*/
function maxDepth(root: _Node | null): number {
if (!root) {
return 0;
}
return 1 + Math.max(...root.children.map(child => maxDepth(child)), 0);
}
Use this to step through a reusable interview workflow for this problem.
BFS with a queue visits every node exactly once — O(n) time. The queue may hold an entire level of the tree, which for a complete binary tree is up to n/2 nodes = O(n) space. This is optimal in time but costly in space for wide trees.
Every node is visited exactly once, giving O(n) time. Space depends on tree shape: O(h) for recursive DFS (stack depth = height h), or O(w) for BFS (queue width = widest level). For balanced trees h = log n; for skewed trees h = n.
Review these before coding to avoid predictable interview regressions.
Wrong move: Recursive traversal assumes children always exist.
Usually fails on: Leaf nodes throw errors or create wrong depth/path values.
Fix: Handle null/base cases before recursive transitions.