【力扣-104.二叉树的最大深度】Python笔记

0 阅读4分钟

彻底搞懂二叉树最大深度:递归法的分治智慧

摘要:还在为二叉树的高度计算发愁吗?本文带你彻底吃透 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)

代码深度解析

为了让你不再晕,我们把执行过程拆解一下:

  1. 终止条件(if not root)

    • 这是递归的“出口”。如果没有这个,程序就会无限循环直到报错。
    • 当我们走到树的尽头(空节点)时,告诉上一层:“这里没高度了,返回 0”。
  2. 左右互搏(left_depth & right_depth)

    • 代码并没有一次性算出结果,而是把任务分派给了 root.leftroot.right
    • 这就像老板(根节点)把任务分给两个经理(左右子节点),经理再分给下属,直到最基层的员工(叶子节点)。
  3. 回溯与合并(return 1 + max...)

    • 当最基层的员工返回 0 后,他的上级(叶子节点)收到消息:1 + max(0, 0) = 1。于是叶子节点告诉它的上级:“我这边高度是 1”。
    • 这个信息一层层往上汇报,每一层都取左右两边的最大值加 1。
    • 最后,老板(根节点)收到了左右经理的汇报,取最大值加 1,得出了整棵树的高度。

拓展思考:除了递归还能怎么做?

虽然递归写法最优雅,但在面试中,面试官可能会问你:“如果树特别深,递归会不会有问题?”

  • 栈溢出风险:如果树退化成链表(深度极大),递归可能导致栈溢出。

  • 迭代法(BFS/层序遍历)

    • 我们可以利用队列(Queue)进行层序遍历。
    • 每遍历完一层,深度计数器 depth + 1
    • 最后遍历结束时,计数器的值就是最大深度。

但在实际工程和算法竞赛中,递归写法因其代码简洁、逻辑清晰,依然是首选。


总结

搞定二叉树最大深度,其实就搞定了一类问题:树形动态规划

记住这个公式:

当前树的高度 = Max(左树高度, 右树高度) + 1

只要你能把大问题拆解成子问题,并且找到终止条件,递归就没有那么可怕啦!

希望这篇笔记能帮你彻底理解这道题。我是爱摸鱼的打工仔,咱们下期见!👋