力扣刷题#27-0104-二叉树的最大深度
力扣刷题#27-0104-二叉树的最大深度
题目
给定一个二叉树 root,返回其最大深度。最大深度是从根节点到最远叶子节点的最长路径上的节点数。
输入: root = [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
输出: 3
我的思路
第一反应:找孩子?
看到"最大深度",我最初的直觉是"去孩子那里找"。但顺着这个直觉继续想,其实可以把它变成一个递归问题:
一棵树的最大深度 = 左右子树里较深的那个,再加 1(自己这一层)。
maxDepth(根) = 1 + max( maxDepth(左子树), maxDepth(右子树) )
生活化类比:
你想知道自己多高,不用从头量到脚。先让左边的兄弟报个"身高",右边兄弟也报个,取更高的那个,加上你自己这一层的 1,就是整棵树的高度。
递归的两个要素
| 要素 | 答案 |
|---|---|
| 递归出口(base case) | 节点为空 → 深度是 0,直接返回 |
| 递归公式 | 1 + max(左子树深度, 右子树深度) |
一步步展开
3
/ \
9 20
/ \
15 7
depth(3) = 1 + max(depth(9), depth(20))
= 1 + max(1, 2)
= 3
| 节点 | 计算过程 | 返回 |
|---|---|---|
| 9 | 1 + max(0, 0) | 1 |
| 15 | 1 + max(0, 0) | 1 |
| 7 | 1 + max(0, 0) | 1 |
| 20 | 1 + max(1, 1) | 2 |
| 3 | 1 + max(1, 2) | 3 |
最长路径:3 → 20 → 15(或 7),共 3 个节点,深度为 3 ✅
我的 AC 代码
class Solution {
public:
int maxDepth(TreeNode* root) {
if (root == nullptr) return 0;
int newd = max(maxDepth(root->left), maxDepth(root->right));
return newd + 1;
}
};
一遍过。
代码逐段解析
第 3 行:递归出口
if (root == nullptr) return 0;
空节点没有深度,返回 0。这是递归必须的终止条件——没有它,递归永远往下钻到 nullptr 再崩。
第 4 行:递归公式
int newd = max(maxDepth(root->left), maxDepth(root->right));
分别问左右子树"你们有多深",取较深的一个。递归先信任子树能给出正确答案——这就是递归的思维:假设子问题已经解决,用子问题的答案拼出当前问题的答案。
第 5 行:加上自己
return newd + 1;
子树深度 + 当前节点这一层 = 当前树的最大深度。
其他解法对比
BFS 层序法(我上一题学的)
层序遍历每走一层深度 +1:
int maxDepth(TreeNode* root) {
if (!root) return 0;
queue<TreeNode*> q;
q.push(root);
int depth = 0;
while (!q.empty()) {
int sz = q.size();
depth++; // 每处理完一层,深度 +1
for (int i = 0; i < sz; i++) {
TreeNode* cur = q.front(); q.pop();
if (cur->left) q.push(cur->left);
if (cur->right) q.push(cur->right);
}
}
return depth;
}
| 对比 | 递归(DFS) | BFS |
|---|---|---|
| 代码 | 3 行核心 | 更长 |
| 思路 | 自顶向下分解 | 逐层推进 |
| 适用 | 几乎所有树题 | 需要"一层"概念时 |
复杂度分析
| 维度 | 值 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 每个节点访问一次 |
| 空间复杂度 | O(h) | 递归栈深度 = 树高 h |
关键点总结
| 关键点 | 说明 |
|---|---|
| 核心公式 | 1 + max(左深, 右深) |
| 递归出口 | root == nullptr → 0 |
| 递归思维 | 先假设子树能算出答案,用子答案拼当前答案 |
| 数学归约 | 大问题 → 两个子问题,深度每次减 1 直到空 |
本文档由 AI 辅助生成,作者提供问题,思路和代码,AI仅负责文本修饰,综合获得以上内容。

浙公网安备 33010602011771号