二叉树的最小深度——递归法、迭代法
创始人
2025-05-31 22:08:44

1题目

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

输入:root = [3,9,20,null,null,15,7]

输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]

输出:5

2链接

题目:111. 二叉树的最小深度 - 力扣(Leetcode)

视频:看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度_哔哩哔哩_bilibili

3解题思路

本题前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)

  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)

那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。

以下讲解中遍历顺序上依然采用后序遍历(因为要比较递归返回之后的结果,本文我也给出前序遍历的写法)。

本题还有一个误区,在处理节点的过程中,最大深度很容易理解,最小深度就不那么好理解,如图:

这就重新审题了,题目中说的是:最小深度是从根节点到最近叶子节点的最短路径上的节点数量。注意是叶子节点。

什么是叶子节点,左右孩子都为空的节点才是叶子节点!

3.1递归法

递归三部曲:

  1. 确定递归函数的参数和返回值

参数为要传入的二叉树根节点,返回的是int类型的深度。

代码如下:

int getDepth(TreeNode* node)
  1. 确定终止条件

终止条件也是遇到空节点返回0,表示当前节点的高度为0。

代码如下:

if (node == NULL) return 0;
  1. 确定单层递归的逻辑

这块和求最大深度可就不一样了,一些同学可能会写如下代码:

int leftDepth = getDepth(node->left);
int rightDepth = getDepth(node->right);
int result = 1 + min(leftDepth, rightDepth);
return result;

这个代码就犯了此图中的误区:

如果这么求的话,没有左孩子的分支会算为最短深度。

所以,如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。

反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。

3.2迭代法

层序遍历

需要注意的是,只有当左右孩子都为空的时候,才说明遍历到最低点了。如果其中一个孩子不为空则不是最低点

4代码

4.1递归法——后序遍历

//递归法——后序遍历
class Solution {
public:int getDepth(TreeNode* root) {// 如果节点为空,深度为0if (root == nullptr) {return 0;}// 递归计算左子树的深度和右子树的深度int leftDepth = getDepth(root->left);//左int rightDepth = getDepth(root->right);//右 //后续为中// 如果当前节点左子树为空且右子树不为空,则最小深度为1加右子树的最小深度if (root->left == nullptr && root->right != nullptr) {return 1 + rightDepth;}// 如果当前节点右子树为空且左子树不为空,则最小深度为1加左子树的最小深度if (root->left != nullptr && root->right == nullptr) {return 1 + leftDepth;}// 否则,取其左右子树最小深度的较小值,并加上1作为当前节点的深度,即可得到整棵树的最小深度int result = min(leftDepth, rightDepth) + 1;return result;}int minDepth(TreeNode* root) {// 调用getDepth函数来获取root节点的最小深度,并返回计算结果return getDepth(root);}
};

这段 C++ 代码中定义了一个名为 Solution 的类,其中实现了两个方法:

  • getDepth 函数,递归计算当前节点的深度。如果该节点左子树为空但右子树不为空,则最小深度为1加右子树的最小深度;如果该节点右子树为空但左子树不为空,则最小深度为1加左子树的最小深度;否则,返回左右子树最小深度的较小值,并加上1作为当前节点的深度,即可得到整棵树的最小深度。

  • minDepth 函数,调用 getDepth 函数并返回计算结果。

4.2递归法——AI生成

//递归法——后序遍历——from AI
// 时间复杂度:O(n),其中n是二叉树的节点个数。每个节点最多被访问一次,因此时间复杂度是O(n)。
// 空间复杂度:O(h),其中h是二叉树的高度。最坏情况下,二叉树呈现链状,空间复杂度是O(n);平均情况下,空间复杂度是O(logn)。
class Solution {
public:int minDepth(TreeNode* root) {if (!root) { // 如果根节点为空,返回0return 0;}if (!root->left && !root->right) { // 如果根节点左右子树都为空,返回1return 1;}int left_depth = INT_MAX; // 记录左子树最小深度if (root->left) {left_depth = minDepth(root->left); // 递归求左子树最小深度}int right_depth = INT_MAX; // 记录右子树最小深度if (root->right) {right_depth = minDepth(root->right); // 递归求右子树最小深度}return min(left_depth, right_depth) + 1; // 返回左右子树最小深度加1的最小值}
};

该函数的输入参数为二叉树的根节点 root,返回值为二叉树的最小深度。首先判断根节点是否为空,如果为空,直接返回深度为0;如果根节点的左右子树都为空,说明当前节点为叶子节点,返回深度为1。

然后,定义变量 left_depth 和 right_depth 分别记录左右子树的最小深度。如果当前节点有左子树,递归调用 minDepth 函数计算左子树的最小深度;同样的,如果当前节点有右子树,则递归计算右子树的最小深度。然后,返回左右子树最小深度加1的最小值。

这个递归算法的思路是:每次从根节点开始,递归计算左右子树的最小深度,然后返回左右子树最小深度加1的最小值,即为整棵树的最小深度。

4.3迭代法

//迭代法——层序遍历
class Solution{
public:int minDepth(TreeNode* root) {// 如果节点为空,返回深度为0if (root == nullptr) return 0;// 创建一个队列,将根节点加入队列中,初始深度为0queue que;que.push(root);int depth = 0;// 循环遍历队列中的每个节点,直到队列为空while (!que.empty()) {// 记录当前队列的大小,该大小等于当前层节点的数目int size = que.size();// 每次遍历队列中的所有节点时,深度加1depth++;// 遍历当前层的所有节点,将下一层的节点加入队列中for (int i = 0; i < size; i++) {// 取出队首节点TreeNode* node = que.front();que.pop();// 将左右子节点加入队列中if (node->left) que.push(node->left);if (node->right) que.push(node->right);// 如果该节点同时没有左右子节点,返回当前深度if (!node->left && !node->right) return depth;}}// 如果整棵树根节点为0,返回深度为0return depth;}
};

这段代码定义了一个名为 Solution 的类,其中实现了一个 minDepth 函数,该函数用于计算一棵二叉树的最小深度。

该函数的输入参数为二叉树的根节点 root,返回值为二叉树的最小深度。如果 root 节点为空,直接返回深度为0。否则,创建一个队列 que,将 root 节点加入队列中,并初始化深度为0。

然后,执行一个循环,每次循环遍历队列中的所有节点,直到队列为空。在循环内,首先记录当前队列的大小 size,该大小等于当前层节点的数目;然后,将深度 depth 加1,表示进入了下一层;遍历当前层的所有节点,将每个节点的左右子节点加入队列中;如果该节点同时没有左右子节点,说明已经到达最小深度,返回当前深度。

如果循环结束后仍然没有找到任何叶子节点,则整棵树只有根节点,返回深度为1。

相关内容

热门资讯

国产登山包那个品牌好?强氧,穿... 本篇文章极速百科给大家谈谈国产登山包那个品牌好?强氧,穿越怎么样,以及国内品牌登山包对应的知识点,希...
路虎揽胜试驾(2024款路虎揽... 本篇文章极速百科给大家谈谈路虎揽胜试驾,以及2024款路虎揽胜试驾对应的知识点,希望对各位有所帮助,...
法兰琳卡会员积分兑换礼品上新啦... 今天给各位分享法兰琳卡会员积分兑换礼品上新啦!的知识,其中也会对法兰琳卡能用吗进行解释,如果能碰巧解...
奥迪A3奥迪A3最新报价-图片... 今天给各位分享奥迪A3奥迪A3最新报价-图片-参数的知识,其中也会对奥迪a3l新车报价2020款图片...
北京奔驰glk300质量怎么样... 今天给各位分享北京奔驰glk300质量怎么样的知识,其中也会对北京奔驰glk200进行解释,如果能碰...
椰子鸡火锅的做法有哪些步骤,大... 椰子鸡火锅的做法有哪些步骤目录椰子鸡火锅的做法有哪些步骤大学生必学的椰子鸡火锅家庭版椰子鸡火锅怎么做...
满堂架搭设验收规范是什么,满堂... 满堂架搭设验收规范是什么目录满堂架搭设验收规范是什么满堂脚手架搭设规范房建满堂架和模板问题满堂脚手架...
雪佛兰是哪个汽车公司旗下的品牌... 今天给各位分享雪佛兰是哪个汽车公司旗下的品牌?雪佛兰旗下品牌有...的知识,其中也会对雪佛兰属于什么...
乒乓球是什么时候从小球变大的,... 乒乓球是什么时候从小球变大的目录乒乓球是什么时候从小球变大的乒乓球由小球换大球是什么时候什么是乒乓球...
药石是什么,药石是什么意思? ... 药石是什么目录药石是什么药石是什么意思?什么是cytokine,它的具体概念是什么药石之言是什么意思...
想念的意思,想念是什么意思? ... 想念的意思目录想念的意思想念是什么意思?思念什么意思概括说明想念的含义想念的意思 想念的释义是...
绝地求生设置怎么调,这配置为什... 绝地求生设置怎么调目录绝地求生设置怎么调这配置为什么玩绝地求生还是会卡?要怎么调画面才适合?绝地求生...
带有杰字的成语 极速百科网 极... 带有杰字的成语目录带有杰字的成语带有杰字的成语 英雄豪杰、识时务者为俊杰、人杰地灵、女中豪杰、...
鲸的种类(鲸的种类很多总的来说... 今天给各位分享鲸的种类的知识,其中也会对鲸的种类很多总的来说可以分两类进行解释,如果能碰巧解决你现在...
U盘的成本价格是多少?(u盘的... 今天给各位分享U盘的成本价格是多少?的知识,其中也会对u盘的价钱一般多少进行解释,如果能碰巧解决你现...
1.0奥拓真实油耗多少(铃木奥... 今天给各位分享1.0奥拓真实油耗多少的知识,其中也会对铃木奥拓10手动挡油耗进行解释,如果能碰巧解决...
长城哈弗m4报价及图片(长城哈... 本篇文章极速百科给大家谈谈长城哈弗m4报价及图片,以及长城哈弗h4新车报价2021款对应的知识点,希...
历史中诸葛亮一共几次北伐曹魏,... 历史中诸葛亮一共几次北伐曹魏目录历史中诸葛亮一共几次北伐曹魏诸葛亮北伐几次三国演义中诸葛亮六次北伐分...
卤水的做法及配方,卤料的配方大... 卤水的做法及配方目录卤水的做法及配方卤料的配方大全?卤水的制作?卤菜的卤汁怎么做?卤水的做法及配方 ...
VC是什么,vc是什么? 极速... VC是什么目录VC是什么vc是什么?VC指什么?vc是什么意思?VC是什么 VC是风险投资(V...
半妖倾城的结局是什么,半妖倾城... 半妖倾城的结局是什么目录半妖倾城的结局是什么半妖倾城结局是be吗电视剧(半妖倾城)结局是什么?半妖倾...
排除通用新君越6T40E自动变... 今天给各位分享排除通用新君越6T40E自动变速器烧片故障的知识,其中也会对别克君越变速箱维修视频进行...
女生日常的基本化妆都需要哪些东... 女生日常的基本化妆都需要哪些东西目录女生日常的基本化妆都需要哪些东西女生日常的基本化妆都需要哪些东西...
支付宝蚂蚁森林怎么刷能量 极速... 支付宝蚂蚁森林怎么刷能量目录支付宝蚂蚁森林怎么刷能量支付宝蚂蚁森林怎么刷能量 蚂蚁森林是支付宝...
足球禁区是什么意思,足球比赛中... 足球禁区是什么意思目录足球禁区是什么意思足球比赛中的“禁区”是指什么?足球场上大禁区小禁区的含义是什...
说唱里面的time是什么意思哈... 说唱里面的time是什么意思哈目录说唱里面的time是什么意思哈说唱中的time是什么意思Hey S...
怎么把电脑音量调节更大,电脑声... 怎么把电脑音量调节更大目录怎么把电脑音量调节更大电脑声音怎么调大怎么才能把电脑的声音调的更大点?如何...
岁末将至敬颂冬绥什么意思,岁末... 岁末将至敬颂冬绥什么意思目录岁末将至敬颂冬绥什么意思岁末将至的下一句是什么?岁末将至,敬颂冬绥是什么...
乌合之众的乌是指什么动物(乌合... 本篇文章极速百科给大家谈谈乌合之众的乌是指什么动物,以及乌合之众的动物是什么生肖对应的知识点,希望对...
什么是有理数(什么是有理数定义... 今天给各位分享什么是有理数的知识,其中也会对什么是有理数定义进行解释,如果能碰巧解决你现在面临的问题...