LeetCode 104. 二叉树的最大深度|Python 解法详解
CSDN 算法专题 · 二叉树 | 难度:简单
题目信息
- 题号:104
- 难度:简单
- LeetCode:题目链接
题目描述
返回二叉树从根节点到最远叶子节点路径上的节点数。
示例
text
输入:root = [3,9,20,null,null,15,7]
输出:3
约束
节点数不超过 10⁴。
解题思路
核心观察
一棵非空树的最大深度等于左右子树最大深度的较大值加一;空树深度为 0。该定义可以直接写成后序递归。
推导与执行步骤
- 空节点返回 0
- 递归求左子树深度
- 递归求右子树深度
- 返回 max(left,right)+1
为什么这个方法正确
算法始终围绕上述核心观察维护有效状态,并且每一步只排除已经能够证明不可能产生更优答案的情况。按照执行步骤处理后,所有可能影响答案的元素或节点都会被恰好检查,因此不会遗漏合法答案;状态更新又严格遵守题目约束,所以最终结果有效。
从边界看,空区间、单个元素、全部相同或完全不匹配等情况都会落入初始化条件或循环终止条件,不需要依赖未定义状态。实现时再重点检查下标、空节点和重复元素,即可保证算法在极端输入下仍然成立。
Python 代码
python
# 解法核心:一棵非空树的最大深度等于左右子树最大深度的较大值加一;空树深度为 0。该定义可以直接写成后序递归。
# 实现步骤:
# 1. 空节点返回 0
# 2. 递归求左子树深度
# 3. 递归求右子树深度
# 4. 返回 max(left,right)+1
from typing import Optional
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
left_depth = self.maxDepth(root.left)
right_depth = self.maxDepth(root.right)
return max(left_depth, right_depth) + 1
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(h)
易错点
加一代表当前节点,不能遗漏。极端链状树递归深度为 n。
总结
这道题的关键是:一棵非空树的最大深度等于左右子树最大深度的较大值加一;空树深度为 0。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。