二叉树最小深度是从根节点到最近叶子节点的最短路径上的节点数,关键要求叶子节点必须左右子树均为空;而最大深度是到最远叶子节点的最长路径节点数,二者在单子树场景下逻辑不同:最小深度需规避将空子树误作有效路径,不能直接用Math.min(left, right) + 1,须分情况处理空子树。

什么是二叉树的最小深度,和最大深度有什么区别?
最小深度不是“叶子节点离根最近的距离”那么简单——它特指从根节点到最近叶子节点的最短路径上的节点数(含根和叶子)。关键点在于:**只有左右子树都为空的节点才算叶子节点**。如果某节点只有左子树或只有右子树,那它不算叶子,路径还得往下走。这点和最大深度(maxDepth)逻辑完全不同,不能直接套用类似写法。
递归实现时怎么处理单侧为空的情况?
递归终止条件容易写错。常见错误是把 nullptr 当作有效路径长度 0 返回,导致单侧为空时误取 min(0, x) == 0,结果直接返回 1(根自己就算深度 1),明显错误。
正确做法是:遇到空节点返回一个“无效大值”,比如 INT_MAX,让 min() 自动忽略它;或者更清晰地分情况判断:
int minDepth(TreeNode* root) {
if (!root) return 0;
if (!root->left && !root->right) return 1; // 叶子节点
int left = root->left ? minDepth(root->left) : INT_MAX;
int right = root->right ? minDepth(root->right) : INT_MAX;
return 1 + min(left, right);
}
BFS 层序遍历为什么更适合求最小深度?
因为 BFS 是按层推进的,**第一次遇到叶子节点时,当前层数就是最小深度**,无需遍历整棵树。这对不平衡树(比如左深右浅)性能优势明显,而递归 DFS 最坏仍需访问全部节点。
实操要点:
- 用
queue存节点,同时用变量记录当前层节点数(或额外存层号) - 每层遍历时检查每个节点:若
!node->left && !node->right,立刻返回当前深度 - 别忘了在进入下一层前清空本层计数,否则会漏判或重复加深度
LeetCode 111 题常见踩坑点
这题输入可能为 nullptr,返回必须是 0;但有些本地测试用例习惯建一个只有根的树,此时答案是 1。最容易错的是把“只有一个子节点”的节点当成叶子——比如 root->left != nullptr && root->right == nullptr,这时必须继续往左走,不能停。
另外,C++ 中不要用 INT_MAX + 1 做计算(会溢出),建议用 1e9 或提前判空再调用递归,避免数值异常。
边界比想象中更脆,尤其当树退化成链表时,BFS 的早停优势才真正体现出来。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











