题目描述
思路解析动画文字版
直觉是枚举所有「根→叶」路径数节点取最长。但同一段子树会被多条路径重复走,做了重复功——3→20 这段在 3→20→15 和 3→20→7 里就各走了一次,越靠上的子树被重走得越多。
转折:每个节点的深度只取决于它左右子树各自的深度,取较大的 + 1(算上自己这层)。所以一次后序遍历、每棵子树只算一次就够,不用重复走路径。空树深度 = 0,是递归触底的基准。
出发 · 后序先扎到底:从根 3 进入递归。后序的规矩:先把左右子树的深度都问出来,再算自己。先往左孩子 9 走。
左孩子 9 · 叶子 depth=1:9 没有孩子,左右子树深度都是 0,depth(9) = 1 + max(0,0) = 1。把 1 返回给父亲 3。
右孩子 20 · 先递归它的孩子:回到根,走右孩子 20。它有孩子,不能直接算,得先下探到 15、7。(9 已算完,标灰)
20 的左孩子 15 · depth=1:15 是叶子,depth(15) = 1。返回给父亲 20。
20 的右孩子 7 · depth=1:7 也是叶子,depth(7) = 1。返回给 20。现在 20 的左右深度都拿到了。
节点 20 · 1+max(1,1)=2:20 结算:depth(20) = 1 + max(depth(15)=1, depth(7)=1) = 2。把 2 返回给根 3。
根 3 · 收集左右深:根 3 的两个孩子都回来了:左深 L=1、右深 R=2。这里是关键:要取较大的那条,不能只看左边的 1。
根 3 · 1+max(1,2)=3:depth(3) = 1 + max(1, 2) = 3,对应最长路径 3→20→15(或 7)。若只走左边 9 那条会得 2,漏掉更深的右子树——这正是要 max 的原因。
一句话记住这道题:父节点的深度 = 1 + max(左深, 右深)。错点全在这个 max——相加会把两条岔路当成一条路,只看一边会漏掉更深的子树。空树是 0、叶子是 1,这就是全部。
边界三连:二叉树的最大深度 的边界先看最小规模、特殊输入和最容易触发分支的样例。
看 merge 怎么换:LC111 最小深度取 1+min(L,R),但单孩子时空的那边不能算(否则被 0 拖成 1,要走有孩子的那侧);LC110 判平衡合并时多查一句 |L−R|≤1,不平衡就回传 −1 剪枝;LC543 直径答案不是返回值,而是过程中维护 max(L+R);LC124 最大路径和负分支要和 0 取 max 后再上传。每道都改这一处。更多在 二叉树专题。
面试追问:全课只此一处面试区,每帧一问一答:返回值语义、为何后序、深度vs高度,再到能否非递归、空间为何 O(h)、会不会爆栈。
参考代码
class Solution: def maxDepth(self, root): if not root: return 0 # 空树,触底 L = self.maxDepth(root.left) # 左子树深 R = self.maxDepth(root.right) # 右子树深 return 1 + max(L, R) # 取较大 +1复杂度
- 时间复杂度:O(n),每个节点算一次
- 空间复杂度:O(h),递归栈深 = 树高 h;最坏退化成链 h=n → O(n),平衡树 h=log n → O(log n)
可套用的代码模板
这道题只是这套骨架的一个实例:空返回基准、递归拿左右答案、合并成当前答案。把 base 设成 0、把 merge 写成 1+max(L,R),就是本题。换 merge 公式就解别的题——下一步看它能迁移到哪。
def dfs(node): if not node: return 基准值 # 空节点的答案 L = dfs(node.left) # 左子树的答案 R = dfs(node.right) # 右子树的答案 return 合并(L, R, node) # 拼成当前节点的答案易错点
面试追问把动画讲成自己的话
追问这个递归函数返回的到底是什么?
追问为什么是后序(先左右、再自己),不是先序?
追问深度(depth)和高度(height)是一回事吗?
追问不用递归能做吗?
追问空间为什么是 O(h) 而不是 O(n)?
追问树很深会爆栈吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
二叉树的直径
LeetCode 543 · 简单 · 沿着 树 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题