leetcode刷题日记:111. Minimum Depth of Binary Tree(二叉树的最小深度)

news/2025/2/1 15:39:12/

给我们一个二叉树,我们应该如何来求二叉树的最小深度呢?
二叉树的最小深度指的是叶子结点到所处的位置最小的,这就是二叉树的最小深度,也就是说我们要找的是离根结点最近的叶子结点。如果我们从根结点向下出发寻找叶子节点,一层一层的去找叶子结点最先找到的叶子结点所处于的深度就是二叉树的最小深度,而叶子结点的标志就是两个指针域都为NULL。所以我们只需要去寻找最先出现的二叉树的两个指针域都为NULL的结点。
但是从上往下去寻找的话,分叉是很多的,这不方便我们的查找,因为分叉越多的话,你先选择遍历哪一条分叉呢?你怎么知道所选的这一条分叉上的叶子结点离根结点最近呢?如果你所选的这一条分叉上找的叶子结点不是离根结点最近的,那么你该怎么选择下一个路径呢?这些都是我们要考虑的问题,就算我们按照从左到右的顺序依次遍历每一条路径去计算路径的长度,我们是不是需要建立一个数组来储存每一个叶子结点到根结点的路径长度,然后再从中挑选最小的。这是很麻烦的。
但是我们换一个思路,从下往上去计算叶子结点到根结点的路径长度,因为按照递归,递归终止条件一旦达成,函数就会逐层返回,在二叉树上的表现就是从叶子结点逐层向上。按照下面图示的方法去计算最小深度你看看是不是更为简单,叶子结点的深度为1(可以看左只有根结点的一颗子树):
在这里插入图片描述
在这里插入图片描述
相信你看了图示之后,大概就明白了,这就是一个不断地从结点的两个子树中以较矮的子树作为长度,然后不断向上知道到达根结点的过程,这一过程可以在递归中自动实现。接下来我们来分析递归的终止条件,一旦访问到 r o o t = = N U L L root==NULL root==NULL说明这一个结点不存在可以看作根结点为空的子树,深度看作0,返回0即可,如果访问的当前结点的左孩子为NULL右孩子也为NULL,说明此节点为叶子结点,按照上图分析,叶子结点是起点返回1,当访问到空结点时此节点不存在,但是如果其兄弟结点存在的话就必定只能从其兄弟所在的路径继续向上,也就是以不为0的路径加1作为当前结点所在路径的最短长度。这样我们就分析路径的变化规则,我们可以写出下面的代码:

int minDepth(struct TreeNode* root) {if(root==NULL)return 0;if(root->left==NULL&&root->right==NULL)return 1;int left = minDepth(root->left);int right = minDepth(root->right);int depth;if(left!=0&&right!=0){depth = left>right?right+1:left+1;}if(left==0){depth = right+1;}if(right == 0){depth = left +1;}return depth; 
}

运行结果截图:
在这里插入图片描述


http://www.ppmy.cn/news/1212733.html

相关文章

大模型应用--prompt工程实践

在使用大模型进行prompt 训练时&#xff0c;自己做的相关笔记。 本文以openai<1.0版为例。 1.调用大模型 定义调用openai大模型的函数 get_completion() def get_completion(prompt, model"gpt-3.5-turbo"):messages [{"role": "user", …

Spring面试题:(五)Spring注解开发@Component,@Autowired,@Bean,@Configuration

Bean基本注解 spring提供注解的版本 Component注解替代bean标签 bean其它属性的相关注解&#xff1a; scope 替代scopelazy 替代lazy-initPostConstruct 替代init-methodPreDestroy 替代destroy-method 使用Component注解的前提是开启注解扫描 衍生注解Repository,Servi…

纯手写 模态框、消息弹框、呼吸灯

在有些做某些网页中&#xff0c;应用不想引用一些前端框架&#xff0c;对于一些比较常用的插件可以纯手写实现 1、模态框 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Water Ripple Effect</title> <style…

CDN是如何减去源机压力的

CDN也叫内容分发网络&#xff08;Content Delivery Network&#xff09;。分布在不同地区的节点服务器组成的分布式网络。通过中心平台的各种功能模块&#xff0c;可以使用户直接访问到就近的节点上&#xff0c;更快获取到需要的内容&#xff0c;大大降低了网络拥堵&#xff0c…

node插件express(路由)的插件使用(二)——cookie 和 session的基本使用区别

文章目录 前言一、express 框架中的 cookie0、cookie的介绍和作用1. 设置cookie2.删除cookie3.获取cookie&#xff08;1&#xff09;安装cookie-parser&#xff08;2&#xff09;导入cookie-parser&#xff08;3&#xff09;注册中间件&#xff08;4&#xff09;获取cookie&…

Spring基础学习——web

Spring基础学习——web 一、Spring整合Web环境1.1 JavaWeb三大组件作用及其特点1.2 Spring整合Web环境的思路及实现1.3 Spring开发Web环境组件spring-web1.4 web层MVC框架思想与设计思路 一、Spring整合Web环境 1.1 JavaWeb三大组件作用及其特点 在Java语言当中&#xff0c;w…

非关系数据库

非关系数据库nosql 用来解决特定问题的数据库 特点&#xff1a; 1.没有关系模式schema-free/non-relational&#xff0c;与关系数据库不同 2.快速处理rapid process&#xff0c;数据放在内存中处理 3.distributed process分布式 4.big data 5.easy program 6.open-sour…

JavaScript条件分支语句-if 语句

if 语句 if语句是JavaScript中最常用的条件分支语句之一&#xff0c;用于根据某个条件来执行不同的代码块。 if语句的语法如下&#xff1a; if (条件) {// 如果条件为真&#xff0c;此处的代码将被执行 }如果要在条件不成立时执行代码块&#xff0c;可以在if语句之后加上一个…