Maximum Depth of N-ary Tree
EasyUpdated: Aug 2, 2025
Practice on:
Problem
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).
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
- The total number of nodes is in the range
[0, 10^4]. - The depth of the n-ary tree is less than or equal to
1000.
Solution
Method 1 – Depth-First Search (DFS)
Intuition
The maximum depth of an N-ary tree is the longest path from the root to any leaf. We can recursively compute the depth for each child and take the maximum.
Approach
- If the root is null, return 0.
- For each child of the root, recursively compute its depth.
- The depth of the tree is 1 plus the maximum depth among all children.
Code
C++
class Solution {
public:
int maxDepth(Node* root) {
if (!root) return 0;
int ans = 0;
for (auto c : root->children) {
ans = max(ans, maxDepth(c));
}
return ans + 1;
}
};
Go
type Node struct {
Val int
Children []*Node
}
func maxDepth(root *Node) int {
if root == nil {
return 0
}
ans := 0
for _, c := range root.Children {
d := maxDepth(c)
if d > ans {
ans = d
}
}
return ans + 1
}
Java
class Solution {
public int maxDepth(Node root) {
if (root == null) return 0;
int ans = 0;
for (Node c : root.children) {
ans = Math.max(ans, maxDepth(c));
}
return ans + 1;
}
}
Kotlin
class Solution {
fun maxDepth(root: Node?): Int {
if (root == null) return 0
var ans = 0
for (c in root.children) {
ans = maxOf(ans, maxDepth(c))
}
return ans + 1
}
}
Python
class Solution:
def maxDepth(self, root: 'Node') -> int:
if not root:
return 0
ans = 0
for c in root.children:
ans = max(ans, self.maxDepth(c))
return ans + 1
Rust
impl Solution {
pub fn max_depth(root: Option<Rc<RefCell<Node>>>) -> i32 {
fn dfs(node: Option<Rc<RefCell<Node>>>) -> i32 {
if let Some(n) = node {
let n = n.borrow();
let mut ans = 0;
for c in &n.children {
ans = ans.max(dfs(c.clone()));
}
ans + 1
} else {
0
}
}
dfs(root)
}
}
TypeScript
class Solution {
maxDepth(root: Node | null): number {
if (!root) return 0;
let ans = 0;
for (const c of root.children) {
ans = Math.max(ans, this.maxDepth(c));
}
return ans + 1;
}
}
Complexity
- ⏰ Time complexity:
O(n), wherenis the number of nodes, since each node is visited once. - 🧺 Space complexity:
O(h), wherehis the height of the tree, due to recursion stack.