Easy
题目描述
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:3
示例 2:
输入:root = [1,null,2]
输出:2
提示:
- 树中节点的数量在
[0, 10^4]区间内。 -100 <= Node.val <= 100
解题思路
这是一道经典的二叉树遍历问题,有多种解法:
方法一:递归(深度优先搜索)(推荐)
这是最直观的解法。对于每个节点,其最大深度等于其左右子树最大深度的较大值加1。递归的终止条件是遇到空节点,返回深度0。
递归公式:maxDepth(root) = max(maxDepth(root.left), maxDepth(root.right)) + 1
方法二:迭代(广度优先搜索)
使用队列进行层序遍历,每遍历完一层就将深度加1。需要记录每层的节点数量,确保正确统计层数。
方法三:迭代(深度优先搜索)
使用栈模拟递归过程,同时记录每个节点对应的深度。遍历过程中更新最大深度值。
递归解法代码简洁且易理解,是首选方案。对于大多数情况,递归的栈开销是可以接受的。
代码实现
class Solution {
public:
int maxDepth(TreeNode* root) {
if (root == nullptr) {
return 0;
}
return max(maxDepth(root->left), maxDepth(root->right)) + 1;
}
};
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1
public class Solution {
public int MaxDepth(TreeNode root) {
if (root == null) {
return 0;
}
return Math.Max(MaxDepth(root.left), MaxDepth(root.right)) + 1;
}
}
var maxDepth = function(root) {
if (root === null) {
return 0;
}
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
};
复杂度分析
| 复杂度 | 递归解法 | 迭代解法(BFS/DFS) |
|---|---|---|
| 时间复杂度 | O(n) | O(n) |
| 空间复杂度 | O(h) | O(w) |
说明:
- n 为二叉树节点总数
- h 为二叉树高度,最坏情况下 h = n(退化为链表)
- w 为二叉树最大宽度,最坏情况下 w = n/2(完全二叉树的最后一层)