Easy
题目描述
给定一个 N 叉树,找到其最大深度。
最大深度是指从根节点到最远叶子节点的最长路径上的节点数。
Nary-Tree input serialization 是用层序遍历,每组子节点都由 null 值分割(参见示例)。
示例 1:
输入:root = [1,null,3,2,4,null,5,6]
输出:3
示例 2:
输入: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]
输出:5
提示:
- 节点总数在范围 [0, 10^4] 内。
- N 叉树的深度小于或等于 1000 。
解题思路
这道题要求计算N叉树的最大深度,本质上是一个树的遍历问题。我们可以用两种经典方法来解决:
方法一:深度优先搜索(DFS) 递归地计算每个子树的最大深度,然后取其中的最大值加1。对于空节点返回0,对于叶子节点返回1。时间复杂度为O(n),空间复杂度为O(h),其中h是树的高度。
方法二:广度优先搜索(BFS) 使用队列进行层序遍历,每遍历完一层就将深度加1。当队列为空时,说明所有节点都已遍历完毕,此时的深度就是最大深度。时间复杂度为O(n),空间复杂度为O(w),其中w是树的最大宽度。
两种方法的时间复杂度相同,但DFS的实现更加简洁直观,而BFS在某些情况下可能有更好的空间表现。推荐使用DFS递归方法,代码简洁且易于理解。
推荐解法:深度优先搜索(DFS)
代码实现
class Solution {
public:
int maxDepth(Node* root) {
if (root == nullptr) {
return 0;
}
int maxChildDepth = 0;
for (Node* child : root->children) {
maxChildDepth = max(maxChildDepth, maxDepth(child));
}
return maxChildDepth + 1;
}
};
class Solution:
def maxDepth(self, root: 'Node') -> int:
if not root:
return 0
if not root.children:
return 1
return max(self.maxDepth(child) for child in root.children) + 1
public class Solution {
public int MaxDepth(Node root) {
if (root == null) {
return 0;
}
int maxChildDepth = 0;
foreach (Node child in root.children) {
maxChildDepth = Math.Max(maxChildDepth, MaxDepth(child));
}
return maxChildDepth + 1;
}
}
var maxDepth = function(root) {
if (!root) return 0;
if (!root.children || root.children.length === 0) return 1;
let maxChildDepth = 0;
for (let child of root.children) {
maxChildDepth = Math.max(maxChildDepth, maxDepth(child));
}
return 1 + maxChildDepth;
};
复杂度分析
| 复杂度类型 | DFS方法 | BFS方法 |
|---|---|---|
| 时间复杂度 | O(n) | O(n) |
| 空间复杂度 | O(h) | O(w) |
其中 n 是节点总数,h 是树的高度,w 是树的最大宽度。在最坏情况下,h = n(退化为链表),w = n(完全展开的树)。