一、题目介绍
题目描述
给定一个二叉树 root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。
示例
示例 1:输入:root = [3,9,20,null,null,15,7]树结构:
plaintext
markdown
3
/ \
9 20
/ \
15 7
输出:3
示例 2:输入:root = [1,null,2]
plaintext
1
\
2
输出:2
难度与标签
简单|二叉树、深度优先搜索、递归
二、解题思路:递归分治思想
核心逻辑
一棵二叉树的最大深度 = 1(当前根节点) + 左子树和右子树深度的最大值
- 递归终止条件 :当前节点为空(
root = null),深度为 0,直接返回; - 单层递归逻辑:分别递归求出左子树深度、右子树深度;
- 结果合并:取左右子树深度更大的值,加上当前节点 1 层,作为当前树深度返回。
举个例子对照示例 1 理解:
- 叶子节点 9:左右都为空,
max(0,0)+1 = 1 - 叶子节点 15:
max(0,0)+1 = 1,叶子 7 同理 = 1 - 节点 20:
max(1,1)+1 = 2 - 根节点 3:
max(1,2)+1 = 3,正好是答案
三、完整 JavaScript 代码
javascript
运行
ini
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var maxDepth = function(root) {
// 空节点深度为0,递归出口
if (!root) return 0;
// 递归计算左、右子树深度
const left = maxDepth(root.left);
const right = maxDepth(root.right);
// 当前层1 + 左右子树最大深度
return 1 + Math.max(left, right);
};
四、代码逐行解析
if (!root) return 0;边界判断:如果当前遍历到空节点,说明这条分支走到尽头,深度计 0,结束本次递归。const left = maxDepth(root.left);递归遍历左孩子,拿到左子树完整深度。const right = maxDepth(root.right);递归遍历右孩子,拿到右子树完整深度。return 1 + Math.max(left, right);``Math.max(left, right)选出更深的那条分支;+1代表当前节点占一层,向上返回给上层递归。
五、复杂度分析
-
时间复杂度 O (n) :n 为二叉树节点总数,每个节点只会被访问一次;
-
空间复杂度 O (h) :h 是树的高度,递归调用栈深度等于树高。
- 平衡二叉树:h = logn,空间 O (logn);
- 单边倾斜树(如示例 2):h = n,空间 O (n)。
六、拓展:迭代层序遍历(BFS)解法
递归是 DFS 思路,这里补充广度优先层序遍历解法,适合不想用递归的场景:思路:逐层遍历,每遍历一层深度 + 1,直到队列为空。
javascript
运行
ini
var maxDepth = function(root) {
if (!root) return 0;
let depth = 0;
const queue = [root];
while(queue.length) {
// 当前层节点数量
const size = queue.length;
for(let i = 0; i < size; i++) {
const node = queue.shift();
if(node.left) queue.push(node.left);
if(node.right) queue.push(node.right);
}
// 一层遍历完成,深度+1
depth++;
}
return depth;
};
七、总结
-
二叉树递归核心:把整棵树拆解为根 + 左子树 + 右子树,分治求解;
-
递归三步法:确定出口条件、单层处理逻辑、合并左右结果;
-
两种解法对比:
- DFS 递归:代码极简,书写最快,面试首选;
- BFS 迭代:直观理解 "层数 = 深度",规避递归栈溢出问题。
这道题是二叉树递归入门经典题,吃透分治思想,后续二叉树直径、平衡二叉树、路径总和等题目都能复用这套递归模板。