彻底搞懂二叉树最大深度:递归法的分治智慧
摘要:还在为二叉树的高度计算发愁吗?本文带你彻底吃透 LeetCode 104 题,用最直观的“分治思想”解析递归法。不讲复杂术语,只用大白话带你理解代码背后的逻辑,助你轻松拿捏树形 DP 问题!
前言
哈喽大家好,我是爱摸鱼的打工仔。
今天我们来聊聊二叉树里的一个经典问题——求最大深度。这道题在面试中出现的频率极高,它是理解树形结构和递归思想的绝佳敲门砖。
别看题目简单,很多人一写递归就容易晕:“我这个函数到底返回了什么?”“为什么加 1?”。
别急,今天咱们就用最通俗的大白话,把这个问题彻底盘明白!
核心知识点:什么是二叉树的最大深度?
在动手写代码之前,咱们得先对齐一下概念。
二叉树的最大深度,指的是从根节点到最远叶子节点的最长路径上的节点数。
怎么理解呢?你可以把它想象成一棵倒着长的树:
- 根节点是树干。
- 叶子节点是树梢。
- 最大深度就是你从树干出发,沿着树枝走,最多能经过几个分叉口才能到达最远的那片树叶。
解题思路:分而治之(Divide and Conquer)
面对一棵大树,我们不需要一下子看清全貌。我们可以把问题拆解:
一棵树的最大深度 = 左子树的最大深度 和 右子树的最大深度,这两者中的较大值 + 1(根节点自己)。
这就好比你要知道这栋楼有多高,你只需要知道“左边那部分有多高”和“右边那部分有多高”,取个最高的,再加上你脚下踩的这一层地板,搞定!
这就是递归的精髓:大事化小,小事化了。
代码实战:递归法
来,直接上代码。这段代码非常短,但逻辑极其严密。
# Definition for a binary tree node.
# 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:
# 1. 递归终止条件(Base Case)
# 如果当前节点是空的(也就是走到了叶子节点的下一层),深度为0
if not root:
return 0
# 2. 递归计算左子树的最大深度
# 也就是问左边的小弟:“你那边有多高?”
left_depth = self.maxDepth(root.left)
# 3. 递归计算右子树的最大深度
# 也就是问右边的小弟:“你那边有多高?”
right_depth = self.maxDepth(root.right)
# 4. 处理当前逻辑
# 当前节点的高度 = 1 (我自己) + 左右两边里最高的那个
return 1 + max(left_depth, right_depth)
代码深度解析
为了让你不再晕,我们把执行过程拆解一下:
-
终止条件(if not root) :
- 这是递归的“出口”。如果没有这个,程序就会无限循环直到报错。
- 当我们走到树的尽头(空节点)时,告诉上一层:“这里没高度了,返回 0”。
-
左右互搏(left_depth & right_depth) :
- 代码并没有一次性算出结果,而是把任务分派给了
root.left和root.right。 - 这就像老板(根节点)把任务分给两个经理(左右子节点),经理再分给下属,直到最基层的员工(叶子节点)。
- 代码并没有一次性算出结果,而是把任务分派给了
-
回溯与合并(return 1 + max...) :
- 当最基层的员工返回 0 后,他的上级(叶子节点)收到消息:
1 + max(0, 0) = 1。于是叶子节点告诉它的上级:“我这边高度是 1”。 - 这个信息一层层往上汇报,每一层都取左右两边的最大值加 1。
- 最后,老板(根节点)收到了左右经理的汇报,取最大值加 1,得出了整棵树的高度。
- 当最基层的员工返回 0 后,他的上级(叶子节点)收到消息:
拓展思考:除了递归还能怎么做?
虽然递归写法最优雅,但在面试中,面试官可能会问你:“如果树特别深,递归会不会有问题?”
-
栈溢出风险:如果树退化成链表(深度极大),递归可能导致栈溢出。
-
迭代法(BFS/层序遍历) :
- 我们可以利用队列(Queue)进行层序遍历。
- 每遍历完一层,深度计数器
depth + 1。 - 最后遍历结束时,计数器的值就是最大深度。
但在实际工程和算法竞赛中,递归写法因其代码简洁、逻辑清晰,依然是首选。
总结
搞定二叉树最大深度,其实就搞定了一类问题:树形动态规划。
记住这个公式:
当前树的高度 = Max(左树高度, 右树高度) + 1
只要你能把大问题拆解成子问题,并且找到终止条件,递归就没有那么可怕啦!
希望这篇笔记能帮你彻底理解这道题。我是爱摸鱼的打工仔,咱们下期见!👋