C++力扣题目111--二叉树的最小深度

力扣题目链接(opens new window)

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

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

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

示例:

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

111.二叉树的最小深度1

返回它的最小深度 2

思路

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

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

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

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

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

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

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

111.二叉树的最小深度

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

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

#递归法

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

  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;

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

111.二叉树的最小深度

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

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

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

代码如下:

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

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

整体递归代码如下:

class Solution {
public:int getDepth(TreeNode* node) {if (node == NULL) return 0;int leftDepth = getDepth(node->left);           // 左int rightDepth = getDepth(node->right);         // 右// 中// 当一个左子树为空,右不为空,这时并不是最低点if (node->left == NULL && node->right != NULL) { return 1 + rightDepth;}   // 当一个右子树为空,左不为空,这时并不是最低点if (node->left != NULL && node->right == NULL) { return 1 + leftDepth;}int result = 1 + min(leftDepth, rightDepth);return result;}int minDepth(TreeNode* root) {return getDepth(root);}
};

精简之后代码如下:

class Solution {
public:int minDepth(TreeNode* root) {if (root == NULL) return 0;if (root->left == NULL && root->right != NULL) {return 1 + minDepth(root->right);}if (root->left != NULL && root->right == NULL) {return 1 + minDepth(root->left);}return 1 + min(minDepth(root->left), minDepth(root->right));}
};

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

前序遍历的方式:

class Solution {
private:int result;void getdepth(TreeNode* node, int depth) {// 函数递归终止条件if (node == nullptr) {return;}// 中,处理逻辑:判断是不是叶子结点if (node -> left == nullptr && node->right == nullptr) {result = min(result, depth);}if (node->left) { // 左getdepth(node->left, depth + 1);}if (node->right) { // 右getdepth(node->right, depth + 1);}return ;}public:int minDepth(TreeNode* root) {if (root == nullptr) {return 0;}result = INT_MAX;getdepth(root, 1);return result;}
};

#迭代法

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

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

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

代码如下:(详细注释)

class Solution {
public:int minDepth(TreeNode* root) {if (root == NULL) return 0;int depth = 0;queue<TreeNode*> que;que.push(root);while(!que.empty()) {int size = que.size();depth++; // 记录最小深度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;}}}return depth;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java入门IDEA基础语法

1&#xff1a;Java入门 1.1 Java简介 Java是什么&#xff1a; Java是一门非常优秀的计算机语言 语言&#xff1a;人与人交流沟通的表达方式 计算机语言&#xff1a;人与计算机之间进行信息交流沟通的一种特殊语言 Java之父&#xff1a;詹姆斯高斯林&#xff08;James Gosli…

履践致远 载誉前行 | 甄知科技获评多项荣誉资质认定!

砥砺深耕 履践致远 甄知科技不断精进 持续成长 获评多项荣誉资质认定 23年4月 甄知成功入库科技型中小企业名单 2023年4月&#xff0c;上海市科技技术委员会公布2023年第二批入库科技型中小企业名单&#xff0c;依据《科技型中小企业评价办法》等要求&#xff0c;经各级评价工…

《尚贤达猎头网站流量统计模块》,通过HTTP自定义模块实时获取asp.net网站访问流量,并保存到数据库

开发了个网站流量统计模块&#xff0c;实时获取asp.net网站访问流量&#xff0c;并保存到数据库。 一、功能&#xff1a; 通过HTTP自定义模块实时获取网站流量 二、支持平台&#xff1a;windowsIIS 三、安装方法&#xff1a; 1、将文件www.sunsharer.cn.dll复制到网站bin目录下…

汽车出海业务专业术语

引言 本文是笔者在做中国汽车出口欧洲业务的信息化建设过程,积累的一些专业术语注解,供诸位参考交流。 专业术语清单 报关   报关是指出口货物的所有者或其代理人,根据中国海关法和相关法规,向海关申报货物的出口情况,并提交相关单证,以便海关对货物进行监管和征税。…

什么是算法的时间复杂度?

一、问题 算法的时间复杂度是评测算法好坏的主要指标&#xff0c;那么什么是算法的时间复杂度呢&#xff1f; 二、解答 算法的时间复杂度度量主要是计算⼀个算法所⽤的时间&#xff0c;算法所⽤的时间主要包括程序编译时间和运⾏时间。由于⼀个算法⼀旦编译成功就可以多次运⾏…

孩子用什么样的灯对眼睛没有伤害?分享最合适孩子的护眼台灯

为人父母以后&#xff0c;孩子健康成长一定是摆放在首位的&#xff0c;随着孩子慢慢长大&#xff0c;步入更高的年级&#xff0c;作业课程也在随之增多。不少孩子哪怕夜色已经降临&#xff0c;仍就伏案在桌子上完成没有做完的功课&#xff0c;作为父母的我们不得不担心孩子的视…

记录一下Canal的错误,主要是top.javatool.canal.client.util下的StringConvertUtil引起的

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 由于数据库的一个localdatetime字段是空的&#xff0c; 然后修改数据库数据同步canal的时候报了这个错误&#xff1a; Caused by: java.lang.IllegalArgumentException: Can not set java.time.LocalD…

浏览器输入一个域名的解析过程

目录 从输入一个域名的解析过程 以www.baidu.com为例子 本地缓存和hosts文件 mDNS和LLMNR NBT-NS 路由器广播 Root域名服务器 顶级域名服务器 目标域名服务器 DNS解析完成 操作系统发起TCP连接&#xff1a; TCP三次握手&#xff1a; TCP连接的建立采用经典的三次握手过程&#…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷③

单元测试 一、任务要求 题目1&#xff1a;输入一个大写字母一个小写字母。根据输入的第一个字母和英文周几单词的第一个大写字母判断是周几&#xff0c;如果无法根据第一个大写字母判断&#xff0c;则继续根据输入的第二个小写字母进行判断&#xff0c;最终返回正确的英文周几…

第88讲:XtraBackup实现增量数据备份以及故障恢复的应用实践

文章目录 1.XtraBackup增量备份恢复的概念2.XBK增量备份语法3.使用XBK实现数据库的增量备份3.1.周日全量备份数据库3.2.周一产生增量数据并进行增量备份3.3.周二产生增量数据并进行增量备份3.4.查看两次增量以及全量的备份文件3.5.核对全量和增量备份的准确性 4.使用XBK通过增量…

Python的运算符和数据类型转换

Python的运算符&#xff1a; 算术运算符: 加法&#xff1a;减法&#xff1a;-乘法&#xff1a;*除法&#xff1a;/取余&#xff1a;%幂运算&#xff1a;**整除&#xff1a;// 比较运算符: 等于&#xff1a;不等于&#xff1a;!大于&#xff1a;>小于&#xff1a;<大于等于…

WPF真入门教程27--项目案例--设备数据实时监测

1、上图看效果 今天要做的一个案例是这样的效果&#xff0c;它能实时监测车间设备有关数据&#xff0c;并以表格和图形显示在界面上&#xff0c;这个比上个案例要复杂些&#xff0c;颜值也高些&#xff0c;通过这个来巩固wpf的技能&#xff0c;用到了命令绑定&#xff0c;样式…

【数据库】视图索引执行计划多表查询笔试题

文章目录 一、视图1.1 概念1.2 视图与数据表的区别1.3 优点1.4 语法1.5 实例 二、索引2.1 什么是索引2.2.为什么要使用索引2.3 优缺点2.4 何时不使用索引2.5 索引何时失效2.6 索引分类2.6.1.普通索引2.6.2.唯一索引2.6.3.主键索引2.6.4.组合索引2.6.5.全文索引 三、执行计划3.1…

uniapp运行自定义底座到真机没反应

同步资源失败&#xff0c;未得到同步资源的授权&#xff0c;请停止运行后重新运行&#xff0c;并注意手机上的授权提示。 如果此时手机没有任何反应&#xff0c;请检查自定义基座是否正确;如果是离线制作的自定义基座包&#xff0c; 请检查离线包制作是否正确。 网上各种查找报…

C++力扣题目513找树左下角的值

给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 思路 本题要找出树的最后一行的最左边的值。此时大家应该想…

C#Stopwatch类高精度计时功能

Stopwatch 是 C# 中的一个类&#xff0c;用于测量时间间隔的工具。它提供了高精度的计时功能&#xff0c;可以用于性能测试、调试和其他需要测量时间的场景。 使用 Stopwatch 类&#xff0c;你可以执行以下操作&#xff1a; 启动计时器&#xff1a;使用 Start 方法启动计时器…

Verilog 状态机 示例

状态机设计&#xff1a;3 段式&#xff08;推荐&#xff09; 状态机设计如下&#xff1a; (0) 首先&#xff0c;根据状态机的个数确定状态机编码。利用编码给状态寄存器赋值&#xff0c;代码可读性更好。 (1) 状态机第一段&#xff0c;时序逻辑&#xff0c;非阻塞赋值&#xf…

okcc呼叫系统如何配置呼入?

配置OKCC的呼入需要进行以下步骤&#xff1a; 1. 登录OKCC管理界面&#xff1a;使用管理员账号和密码登录OKCC的管理界面。通常可以在浏览器中输入OKCC的IP地址或域名来访问管理界面。 2. 确认网关配置&#xff1a;在OKCC管理界面中&#xff0c;确认已正确配置了网关&#xf…

在windows11系统上利用docker搭建linux记录

我的windows11系统上&#xff0c;之前已经安装好了window版本的docker&#xff0c;没有安装的小伙伴需要去安装一下。 下面直接记录安装linux的步骤&#xff1a; 一、创建linux容器 1、拉取镜像 docker pull ubuntu 2、查看镜像 docker images 3、创建容器 docker run --…

rtm姿态跟踪

6年前&#xff1a; GitHub - YuliangXiu/PoseFlow: PoseFlow: Efficient Online Pose Tracking (BMVC18) 报错&#xff1a; Clarification on min_keypoints in tracking Issue #1411 open-mmlab/mmpose GitHub https://github.com/open-mmlab/mmpose/blob/c8e91ff456d82c…