目录

题目描述

104. 二叉树的最大深度

image-20230305172416291

题意分析

给定二叉树的根节点,返回它的最大深度。

定义要先咬准:最大深度是从根节点到最远叶子节点的最长路径上的节点数——按节点数计,不是按边数计。单个节点的树深度是 1 而不是 0,这是读题时最容易带偏的一点。

约束上节点数在 010^4 之间,也就是说 root 可能为 null。边界情况:空树深度为 0;只有根节点深度为 1;树完全退化成一条链时,深度等于节点总数。

解法:递归计算左右子树深度

核心思路

定义 maxDepth(node) 为以 node 为根的子树深度。空节点深度为 0;非空节点的深度等于左右子树较大深度加上当前节点这一层。

递推式:maxDepth(node) = max(maxDepth(node.left), maxDepth(node.right)) + 1

解题步骤

  • 当前节点为空时返回 0
  • 递归计算左右子树的最大深度。
  • 取较大值并加 1,计入当前节点。

代码实现

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        return Math.max(leftDepth, rightDepth) + 1;
    }
}
func maxDepth(root *TreeNode) int {
    if root == nil {
        return 0
    }
    leftDepth := maxDepth(root.Left)
    rightDepth := maxDepth(root.Right)
    if leftDepth > rightDepth {
        return leftDepth + 1
    }
    return rightDepth + 1
}

复杂度分析

  • 时间复杂度:$O(n)$,每个节点访问一次。
  • 空间复杂度:$O(h)$,递归栈深度等于树高 h;树退化成链时最坏为 $O(n)$,完全平衡时为 $O(\log n)$。

关键点总结

  • 递归函数返回当前子树的最大深度。
  • 空节点返回 0,叶子节点自然得到 1
  • 左右子树都要计算,最长路径可能位于任意一侧。

易错点总结

  • 忘记空节点判断会触发空指针错误。
  • 返回值漏掉 +1,会少算当前节点这一层。
  • 只递归一侧会漏掉另一侧的更深路径。
  • 最大深度按节点数计算,单节点树的深度是 1

相似题目

题目 难度 考察点
110. 平衡二叉树 简单 求高度的同时判断左右高度差
111. 二叉树的最小深度 简单 求最小值,空子树不能直接参与取 min
559. N 叉树的最大深度 简单 孩子从两个推广到列表遍历
剑指 Offer 55 - I. 二叉树的深度 简单 与本题同题的剑指版本
剑指 Offer 55 - II. 平衡二叉树 简单 自底向上返回高度并用哨兵值短路
面试题 04.04. 检查平衡性 简单 平衡判断的程序员面试金典版本