104. 二叉树的最大深度(简单)

Blind 75 › 104. 二叉树的最大深度(简单) (第 2 章)
文章工具

题目

给定一棵二叉树的根节点 root,返回它的最大深度。

这里的“深度”按节点数计算:从根节点到最远叶子节点的最长路径上一共经过多少个节点。叶子是指既没有左孩子、也没有右孩子的节点。

自造示例:root = [7,3,9,null,5],其中 7 的左孩子是 3、右孩子是 9;3 只有右孩子 5。最长路径是 7 → 3 → 5,共 3 个节点,所以返回 3。

约束:节点数 0 ~ 104;节点值 -100 ~ 100;空树 root = [] 应返回 0。

思路

一句话:让左右子树各自汇报深度,当前节点的深度就是 1 + max(左子树深度, 右子树深度)。

先想最直白的:从根出发,把所有“根到叶子”的路径都走一遍,每条路径记录经过的节点数,最后取最大值。这个做法当然正确,但需要显式维护当前路径长度和回溯,代码比较绕。

再想按层数:用队列一层一层往下扫,每扫完一整层就把层数加 1,最后扫到第几层就是最大深度。这个想法也很直观,但需要额外处理“这一层在哪里结束、下一层从哪里开始”。

关键观察:树的最大深度有递归结构。以任意节点 u 为根的子树,它的最深路径只有两种走法——要么先进入左子树,要么先进入右子树;无论走哪边,剩下的问题都是同一个“求某棵子树的最大深度”。于是有:

  • 空节点的深度是 0,因为没有节点。
  • 非空节点的深度是 1 + max(左子树最大深度, 右子树最大深度),其中 1 是当前节点自己。

递归 DFS 把这个式子直接翻译出来,代码最短,选它做主解法;迭代 DFS 和 BFS 是同一定义下的另外两种实现,放在「扩展三」对照。

解法

  1. 若 root 为空,返回 0。
  2. 递归求左子树最大深度 left。
  3. 递归求右子树最大深度 right。
  4. 返回 1 + max(left, right)。

用自造示例从叶子往根走一遍:

节点左子树深度右子树深度该子树返回
5001 + max(0, 0) = 1
3011 + max(0, 1) = 2
9001 + max(0, 0) = 1
7211 + max(2, 1) = 3

根节点 7 汇总出 3,就是整棵树的最大深度。

下图把上面 4 个步骤串成流程,并逐步演示:

104. 二叉树的最大深度(简单) 解法步骤流程图
图① 解法步骤流程图(共 4 步)。
104. 二叉树的最大深度(简单) 按步骤逐步执行的动画
动图② 按步骤依次推进(循环播放)。

C++

C++ 片段需补全 main() 函数才能运行在实训台打开 →
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
 int maxDepth(TreeNode* root) {
 if (root == nullptr) re

🔒

本篇为付费内容

您已阅读试读部分,购买后即可解锁全文。

⚠️ 本站内容已做唯一性标记并受版权保护,未经授权禁止转载,侵权必究。