0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

二叉树的最小深度

算法与数据结构 来源:代码随想录 作者:代码随想录 2022-04-28 16:27 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

和求最大深度一个套路?

111.二叉树的最小深度

题目地址:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/

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

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

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

示例:

给定二叉树[3,9,20,null,null,15,7],

27d8a3d6-c6a8-11ec-bce3-dac502259ad0.png

返回它的最小深度 2.

思路

看完了这篇104.二叉树的最大深度,再来看看如何求最小深度。

直觉上好像和求最大深度差不多,其实还是差不少的。

遍历顺序上依然是后序遍历(因为要比较递归返回之后的结果),但在处理中间节点的逻辑上,最大深度很容易理解,最小深度可有一个误区,如图:

27ed27fc-c6a8-11ec-bce3-dac502259ad0.png

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

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

递归法

来来来,一起递归三部曲:

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

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

代码如下:

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

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

代码如下:

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

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

intleftDepth=getDepth(node->left);
intrightDepth=getDepth(node->right);
intresult=1+min(leftDepth,rightDepth);
returnresult;

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

27ed27fc-c6a8-11ec-bce3-dac502259ad0.png

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

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

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

代码如下:

intleftDepth=getDepth(node->left);//左
intrightDepth=getDepth(node->right);//右
//中
//当一个左子树为空,右不为空,这时并不是最低点
if(node->left==NULL&&node->right!=NULL){
return1+rightDepth;
}
//当一个右子树为空,左不为空,这时并不是最低点
if(node->left!=NULL&&node->right==NULL){
return1+leftDepth;
}
intresult=1+min(leftDepth,rightDepth);
returnresult;

遍历的顺序为后序(左右中),可以看出:求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。

整体递归代码如下:

classSolution{
public:
intgetDepth(TreeNode*node){
if(node==NULL)return0;
intleftDepth=getDepth(node->left);//左
intrightDepth=getDepth(node->right);//右
//中
//当一个左子树为空,右不为空,这时并不是最低点
if(node->left==NULL&&node->right!=NULL){
return1+rightDepth;
}
//当一个右子树为空,左不为空,这时并不是最低点
if(node->left!=NULL&&node->right==NULL){
return1+leftDepth;
}
intresult=1+min(leftDepth,rightDepth);
returnresult;
}

intminDepth(TreeNode*root){
returngetDepth(root);
}
};

精简之后代码如下:

classSolution{
public:
intminDepth(TreeNode*root){
if(root==NULL)return0;
if(root->left==NULL&&root->right!=NULL){
return1+minDepth(root->right);
}
if(root->left!=NULL&&root->right==NULL){
return1+minDepth(root->left);
}
return1+min(minDepth(root->left),minDepth(root->right));
}
};

精简之后的代码根本看不出是哪种遍历方式,所以依然还要强调一波:如果对二叉树的操作还不熟练,尽量不要直接照着精简代码来学。

迭代法

相对于104.二叉树的最大深度,本题还可以使用层序遍历的方式来解决,思路是一样的。

如果对层序遍历还不清楚的话,可以看这篇:二叉树:层序遍历登场!

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

代码如下:(详细注释)

classSolution{
public:

intminDepth(TreeNode*root){
if(root==NULL)return0;
intdepth=0;
queueque;
que.push(root);
while(!que.empty()){
intsize=que.size();
depth++;//记录最小深度
for(inti=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){//当左右孩子都为空的时候,说明是最低点的一层了,退出
returndepth;
}
}
}
returndepth;
}
};

其他语言版本

Java

classSolution{
/**
*递归法,相比求MaxDepth要复杂点
*因为最小深度是从根节点到最近**叶子节点**的最短路径上的节点数量
*/
publicintminDepth(TreeNoderoot){
if(root==null){
return0;
}
intleftDepth=minDepth(root.left);
intrightDepth=minDepth(root.right);
if(root.left==null){
returnrightDepth+1;
}
if(root.right==null){
returnleftDepth+1;
}
//左右结点都不为null
returnMath.min(leftDepth,rightDepth)+1;
}
}
classSolution{
/**
*迭代法,层序遍历
*/
publicintminDepth(TreeNoderoot){
if(root==null){
return0;
}
Dequedeque=newLinkedList<>();
deque.offer(root);
intdepth=0;
while(!deque.isEmpty()){
intsize=deque.size();
depth++;
for(inti=0;i< size; i++) {
                TreeNode poll = deque.poll();
                if(poll.left==null&&poll.right==null){
//是叶子结点,直接返回depth,因为从上往下遍历,所以该值就是最小值
returndepth;
}
if(poll.left!=null){
deque.offer(poll.left);
}
if(poll.right!=null){
deque.offer(poll.right);
}
}
}
returndepth;
}
}

Python

递归法:

classSolution:
defminDepth(self,root:TreeNode)->int:
ifnotroot:
return0
ifnotroot.leftandnotroot.right:
return1

min_depth=10**9
ifroot.left:
min_depth=min(self.minDepth(root.left),min_depth)#获得左子树的最小高度
ifroot.right:
min_depth=min(self.minDepth(root.right),min_depth)#获得右子树的最小高度
returnmin_depth+1

迭代法:

classSolution:
defminDepth(self,root:TreeNode)->int:
ifnotroot:
return0
que=deque()
que.append(root)
res=1

whileque:
for_inrange(len(que)):
node=que.popleft()
#当左右孩子都为空的时候,说明是最低点的一层了,退出
ifnotnode.leftandnotnode.right:
returnres
ifnode.leftisnotNone:
que.append(node.left)
ifnode.rightisnotNone:
que.append(node.right)
res+=1
returnres
--- EOF ---

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 节点
    +关注

    关注

    0

    文章

    226

    浏览量

    25418
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66838
  • 二叉树
    +关注

    关注

    0

    文章

    74

    浏览量

    12862

原文标题:二叉树的最小深度!

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    年薪100万以上模拟芯片专家的技能

    模拟专家的技能围绕核心电路设计能力、工具与流程掌握、行业特定技术深度、工程实践与管理能力四大维度展开,具体如下:一、核心电路设计与模块技术能力1.基础模拟模块设计功底通用模块精通:需熟练设计深亚
    的头像 发表于 11-12 17:42 1111次阅读
    年薪100万以上模拟芯片专家的技能<b class='flag-5'>树</b>

    通过优化代码来提高MCU运行效率

    选择时间复杂度低的算法。 根据访问模式选择数据结构。频繁查找用哈希表,有序数据用二叉树等。 查表法:对于复杂的数学计算(如sin, log),或者协议解析,预先计算好结果存于数组中,用空间换时间
    发表于 11-12 08:21

    请问rtt studio 的文件夹打红什么意思?

    rtt studio 的文件夹打红什么意思?而且文件夹里面实际是有文件的,但是浏览不出来。
    发表于 09-18 06:34

    科技,被起诉

    电子发烧友网综合报道 天眼查显示,近日,杭州宇科技股份有限公司(以下简称“宇科技”)新增1条开庭公告,原告为杭州露韦美日化有限公司(以下简称“露韦美日化”),案由为侵害发明专利权纠纷,该案将于8
    的头像 发表于 08-26 07:50 4532次阅读
    宇<b class='flag-5'>树</b>科技,被起诉

    亿纬锂能荣获杭集团2022-2024年度优秀供应商奖

    近日,亿纬锂能凭借卓越产品、可靠交付与优质服务荣获杭集团颁发的“2022-2024年度优秀供应商”奖。杭集团副总经理兼杭电器董事长金华曙、杭电器总经理兼杭博电机总经理李明辉出席
    的头像 发表于 07-15 09:00 767次阅读

    存储示波器的存储深度对信号分析有什么影响?

    测量结果波动大(如抖动测量误差±50%)。 案例: 测量100MHz时钟的周期抖动,存储深度10kpts → 抖动测量误差±10ps。 存储深度升级至1Mpts → 抖动测量误差±1ps。 、存储
    发表于 05-27 14:39

    白话理解RCC时钟(可下载)

    时钟就像是单片机的“心脏”,单片机正常工作离不开时钟的支持,下图是我们单片机的时钟 ,它反映了单片机的时钟关系。我们来详细描述一下时钟的工作原理。寄存器上电后有一个复位值,大家看我画红线的这个
    发表于 03-27 13:50 0次下载

    机器人看点:宇科技王兴兴回上海母校 加速商业化落地 宇机器人手租赁火爆

    给大家带来一些机器人的消息: 宇科技王兴兴回上海母校 加速商业化落地 日前,宇科技创始人王兴兴在接受媒体专访时候,介绍了公司的H1人形机器人的技术亮点及行业前景,H1人形机器人是首款能原地后翻出
    的头像 发表于 02-25 11:26 1775次阅读

    求解答,设备问题

    请问,rk3588j要再提取一个USB3.0接口设备怎么改
    发表于 02-20 11:22

    BP神经网络与深度学习的关系

    ),是一种多层前馈神经网络,它通过反向传播算法进行训练。BP神经网络由输入层、一个或多个隐藏层和输出层组成,通过逐层递减的方式调整网络权重,目的是最小化网络的输出误差。 深度学习的定义与发展
    的头像 发表于 02-12 15:15 1340次阅读

    科技在物联网方面

    。 人工智能算法优化:宇科技不断优化其机器人的人工智能算法,使其能够在物联网环境中更好地进行智能决策。通过机器学习、深度学习等技术,机器人可以从大量的数据中学习和提取知识,不断提高自身的感知、认知和决策
    发表于 02-04 06:48

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-初识设备之设备组成和结构

    的name和value。在设备中,可描述的信息包括:一、CPU的数量和类别;、内存基地址和大小;三、总线和桥;四、外设连接;五、中断控制器和中断使用情况;六、GPIO控制器和GPIO使用情况;七
    发表于 01-08 08:32

    3D深度感测的原理和使用极管激光来实现深度感测的优势

      本文介绍了3D深度感测的原理和使用极管激光来实现深度感测的优势。 世界是三维的。这句话如此容易理解,以至于大多数人从未怀疑过自己感知世界的方式。但事实上,人的每只眼睛每次可捕获一幅平面图
    的头像 发表于 01-07 09:54 1076次阅读
    3D<b class='flag-5'>深度</b>感测的原理和使用<b class='flag-5'>二</b>极管激光来实现<b class='flag-5'>深度</b>感测的优势

    飞凌嵌入式ElfBoard ELF 1板卡-初识设备之设备组成和结构

    的name和value。在设备中,可描述的信息包括:一、CPU的数量和类别;、内存基地址和大小;三、总线和桥;四、外设连接;五、中断控制器和中断使用情况;六、GPIO控制器和GPIO使用情况;七
    发表于 01-07 09:16

    MCU最小系统电路设计指南

    目录 一、何为最小系统? 最小系统电路设计 1.电源 (1)各种名词解释 (2)为什么会有VDD_1 _2 _3区分? (3)Mirco USB (4)5v->3.3v滤波电路 (5)电源指示灯
    的头像 发表于 12-09 12:38 2333次阅读
    MCU<b class='flag-5'>最小</b>系统电路设计指南