二叉树的最大深度
一、题目
给定一个二叉树
root
,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:3示例 2:
输入:root = [1,null,2] 输出:2提示:
- 树中节点的数量在
[0, 104]
区间内。-100 <= Node.val <= 100
二、源代码
#define MAX(a, b) ((b) > (a) ? (b) : (a))
int maxDepth(struct TreeNode* root) {if (root == NULL) {return 0;}int l_depth = maxDepth(root->left);int r_depth = maxDepth(root->right);return MAX(l_depth, r_depth) + 1;
}
三、解题思
1.宏定义 MAX(a, b)
这是一个宏定义,作用是获取两个整数中的最大值。
原理:通过三目运算符 (b) > (a) ? (b) : (a) 实现,若 b 大于 a 则返回 b,否则返回 a。
括号的作用:避免宏替换时因运算符优先级导致的逻辑错误(例如传入复杂表达式时)。
2. 函数 maxDepth(struct TreeNode* root)
函数功能:计算以 root 为根节点的二叉树的最大深度(从根节点到最远叶子节点的路径上的节点总数)。
(1)参数与返回值
参数 struct TreeNode* root:指向二叉树根节点的指针(struct TreeNode 是二叉树节点的结构体,通常包含数据域和左右子节点指针,如 int val; struct TreeNode *left; struct TreeNode *right;)。
返回值:int 类型,代表二叉树的最大深度。
(2)核心逻辑
if (root == NULL) {
return 0;
}
终止条件:若当前节点 root 为 NULL(空节点),说明这是一棵空树(或子树),深度为 0,直接返回 0。
int l_depth = maxDepth(root->left);
int r_depth = maxDepth(root->right);
递归计算:
递归调用 maxDepth(root->left) 计算左子树的最大深度,结果存到 l_depth 中。
递归调用 maxDepth(root->right) 计算右子树的最大深度,结果存到 r_depth 中。
return MAX(l_depth, r_depth) + 1;
计算当前树的深度:
对于非空节点 root,其所在树的最大深度 = 左、右子树深度的最大值 + 1(加 1 是因为要包含当前节点本身)。
四、总结
这段代码通过递归分解问题:将整棵树的深度转化为「左子树深度」和「右子树深度」的最大值加 1,最终通过终止条件(空节点返回 0)回溯得到结果。