题目描述
思路解析动画文字版
记牢「先算孩子、取最大、加一层」,下面每一帧都在套它。
准备 · 从根出发:先看整棵树。我们要算根 50 的子树深度。办法是从根往下递归:先把每个孩子的子树深度都算清楚,再取最大、加上自己这一层。下面跟着紫色的「当前节点」一路下探。
下行 · 进入 50:走到节点 50(紫色)。它的孩子列表有 2 个:30、80。想知道 50 的深度,得先把这几个孩子的子树深度逐个算出来。
下探 · 50 的孩子:按后序的规矩,先把第一个孩子 30 的子树彻底算完,再回头看 50 剩下的孩子。我们顺着这条边往下走。
下行 · 进入 30:走到节点 30(紫色)。它的孩子列表有 2 个:10、20。想知道 30 的深度,得先把这几个孩子的子树深度逐个算出来。
下探 · 30 的孩子:按后序的规矩,先把第一个孩子 10 的子树彻底算完,再回头看 30 剩下的孩子。我们顺着这条边往下走。
下行 · 叶子 10:走到节点 10(紫色)。它的孩子列表是空的,是个叶子,不用再往下了。
结算 · 10 = 1:叶子 10 没有孩子,最深孩子算 0,加上自己这一层,子树深度就是 1。节点 10 标绿,表示它的深度已经定下来了。
返回 · 回到 30:孩子 10 那一支已经算完(深度 1),回到 30。它还有孩子没算,接着深入下一个 20。
下行 · 叶子 20:走到节点 20(紫色)。它的孩子列表是空的,是个叶子,不用再往下了。
结算 · 20 = 1:叶子 20 没有孩子,最深孩子算 0,加上自己这一层,子树深度就是 1。节点 20 标绿,表示它的深度已经定下来了。
汇总 · 30 的孩子:30 的孩子都算完了,子树深度分别是 1、1。我们要的是最深的那个,取最大值得到 1。正在判定 30,先别急着定色。
结算 · 30 = 2:最深的孩子子树是 1,加上 30 自己这一层,30 的子树深度 = 1 + 1 = 2。节点 30 标绿,深度敲定。
返回 · 回到 50:孩子 30 那一支已经算完(深度 2),回到 50。它还有孩子没算,接着深入下一个 80。
下行 · 进入 80:走到节点 80(紫色)。它的孩子列表有 1 个:60。想知道 80 的深度,得先把这几个孩子的子树深度逐个算出来。
下探 · 80 的孩子:按后序的规矩,先把第一个孩子 60 的子树彻底算完,再回头看 80 剩下的孩子。我们顺着这条边往下走。
下行 · 叶子 60:走到节点 60(紫色)。它的孩子列表是空的,是个叶子,不用再往下了。
结算 · 60 = 1:叶子 60 没有孩子,最深孩子算 0,加上自己这一层,子树深度就是 1。节点 60 标绿,表示它的深度已经定下来了。
汇总 · 80 的孩子:80 的孩子都算完了,子树深度分别是 1。我们要的是最深的那个,取最大值得到 1。正在判定 80,先别急着定色。
结算 · 80 = 2:最深的孩子子树是 1,加上 80 自己这一层,80 的子树深度 = 1 + 1 = 2。节点 80 标绿,深度敲定。
汇总 · 50 的孩子:50 的孩子都算完了,子树深度分别是 2、2。我们要的是最深的那个,取最大值得到 2。正在判定 50,先别急着定色。
结算 · 50 = 3:最深的孩子子树是 2,加上 50 自己这一层,50 的子树深度 = 1 + 2 = 3。节点 50 标绿,深度敲定。
完成:所有节点都结算完了。根 50 的两个孩子 30 和 80 子树深度都是 2,取最大 2 再加 1,根的子树深度就是 3。这正是从根到最远叶子那条路上的节点数,答案 = 3。
边界先想清:空树 0、单节点 1;孩子很多但都是叶子时深度还是 2,宽度不影响深度。
面试常被追问和 lc104 的关系、以及迭代写法(BFS 数层数)。
参考代码
from typing import Listclass Node: def __init__(self, val=None, children=None): self.val = val self.children = children if children is not None else []class Solution: def maxDepth(self, root: 'Node') -> int: if not root: return 0 return 1 + max([self.maxDepth(c) for c in root.children] or [0])复杂度
- 时间:O(n),每个节点恰好被访问一次,做的都是常数工作(取最大、加一),n 是节点总数
- 空间:O(h),递归栈深度等于树高 h;最坏退化成一条链时 h 可达 n
易错点
面试追问把动画讲成自己的话
追问这题和二叉树最大深度(LeetCode 104)有什么区别?
追问能不能不用递归,改成迭代?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
二叉树的坡度
LeetCode 563 · 简单 · 沿着 树套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题