力扣日记11.28-【二叉树篇】二叉树的最小深度

力扣日记:【二叉树篇】二叉树的最小深度

日期:2023.11.28
参考:代码随想录、力扣

111. 二叉树的最小深度

题目描述

难度:简单

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

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

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

示例 1:
在这里插入图片描述

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

示例 2:

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

提示:

  • 树中节点数的范围在 [0, 10^5] 内
  • -1000 <= Node.val <= 1000

题解

递归(cpp ver)

使用后序遍历(记得排除非叶子节点的情况)

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
#define SOLUTION 2
class Solution {
public:
#if SOLUTION == 1// 1. 递归的参数以及返回值int getDepth(TreeNode* node) {// 2. 终止条件if (node == nullptr) return INT_MAX;    // 排除不是叶子节点if (node->left == nullptr && node->right == nullptr) return 1;  // 当前节点为叶子节点, 返回1(而不是0)// 3. 处理逻辑int leftDepth = getDepth(node->left);   // 左int rightDepth = getDepth(node->right); // 右int depth = 1 + min(leftDepth, rightDepth); // 中 return depth;}int minDepth(TreeNode* root) {if (root == nullptr) return 0;return getDepth(root);}
#elif SOLUTION == 2// 1. 递归参数与返回值(输入为当前节点,返回值为当前节点的高度)int getDepth(TreeNode* node) {// 2. 终止条件if (node == nullptr) return 0;// 3. 处理逻辑// 左int leftDepth = getDepth(node->left);// 右int rightDepth = getDepth(node->right);// 中// 注意最小深度是根节点到距离最近的叶子节点的节点数,因此要排除非叶子节点的情况if (node->left == nullptr && node->right != nullptr) {// 当左节点为空而右节点不为空,说明左节点不是叶子节点,说明最小深度是 1 + 右子树的深度return 1 + rightDepth;}if (node->right == nullptr && node->left != nullptr) {// 同理return 1 + leftDepth;}// 都不为空,则返回两者最小return 1 + min(leftDepth, rightDepth);}int minDepth(TreeNode* root) {return getDepth(root);}
#endif
};
迭代(go ver)

使用层序遍历

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func minDepth(root *TreeNode) int {queue := list.New()if root != nil {queue.PushBack(root)}curDepth := 0for queue.Len() > 0 {// 记录当前队列长度size := queue.Len()curDepth += 1   // 记录当前深度for size > 0 {  // 处理当前层// 弹出并写入结果front := queue.Front()node := queue.Remove(front).(*TreeNode) // 存进list之后类型会变为*list.Element,要转换为*TreeNode// 如果没有左右节点、说明到达了叶子节点,当前深度即为最小深度if node.Left == nil && node.Right == nil {return curDepth}if node.Left != nil {queue.PushBack(node.Left)}if node.Right != nil {queue.PushBack(node.Right)}size -= 1}}return curDepth
}

复杂度

时间复杂度:
空间复杂度:

思路总结

  • 注意最小深度是根节点到距离最近的叶子节点的节点数,因此要排除非叶子节点的情况

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

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

相关文章

TDA4VM EVM开发板调试笔记

文章目录 1. 前言2. 官网资料导读3. 安装 Linux SDK4. 制作SD 启动卡5. 验证启动1. 前言 TDA4作为一般经典的车规级SOC芯片,基于它的低阶智驾方案目前成为各家智驾方案公司的量产首选,这也使得基于TDA4的开发需求陡增,开发和使用TDA4既要熟悉Linux驱应用开发,还要熟悉传统…

des加密算法的c++ 实现

以下是一个简单的 C 语言实现 DES 加密算法的例子&#xff1a; #include <stdio.h> #include <string.h> #include <openssl/des.h>int main() {// 设置 DES 密钥const char* key "01234567";DES_cblock des_key;memcpy(des_key, key, 8);// 设置…

《opencv实用探索·五》opencv小白也能看懂的图像腐蚀

1、图像腐蚀原理简单理解&#xff1a; 腐蚀是形态学最基本的操作&#xff0c;都是针对白色部分&#xff08;高亮部分&#xff09;而言的。即原图像中高亮部分被蚕食&#xff0c;得到比原图更小的区域。 2、图像腐蚀的作用&#xff1a; &#xff08;1&#xff09;去掉毛刺&…

如何安装鸿蒙Harmony 4.0低版API9三方库

比如我要用下拉刷新三方库pulltorefresh 安装命令如下 ohpm install ohos/pulltorefresh 安装完后然后运行Demo报错,说没有isAtEnd方法 然后查看pulltorefresh 最新版2.0.4对应Harmony API10,然而我的手机是API9,所以必须找到API9的库&#xff0c;然后查看2.0.1是还是API9 所…

测试与管理 Quota

用myquota1创建一个大的文件测试 理论猜想&#xff1a;超过soft可以&#xff0c;但是超过hard就不行了&#xff0c;最大值就是hard&#xff0c;如果超过soft&#xff0c;过了17天不处理&#xff0c;最后限制值会被强制设置成soft。修改设置成hard值 切换测试用户&#xff0c;m…

对话汪源:数智时代为企业构建新的竞争力,和网易数帆的“为与不为”

CodeWave在内的诸多“主演”正在重新演绎网易数帆&#xff0c;在网易数帆的新故事里&#xff0c;做专业、底层、核心的工具&#xff0c;是其成长至今最核心的底色。 作者|斗斗 编辑|皮爷 出品|产业家 “我希望在中间层能构建一个好的生态。”网易汪源的这句话&#xff0c;让…

如何使用Qchan搭建更好保护个人隐私的本地图床并在公网可访问

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

如何让你的 Jmeter+Ant 测试报告更具吸引力?

引言 想象一下&#xff0c;你辛苦搭建了一个复杂的网站&#xff0c;投入了大量的时间和精力进行开发和测试。当你终于完成了测试并准备生成测试报告时&#xff0c;你可能会发现这个过程相当乏味&#xff0c;而对于其他人来说&#xff0c;它可能也不那么吸引人。 但是&#xf…

大语言模型新升级:亚马逊云科技2023芯片创新日

在这个充满活力的2023年芯片创新日&#xff0c;Amazon EC2 的副总裁 Dave Brown 与观众分享了他与 EC2 的15年漫长旅程。他的眼中闪烁着对技术的热情&#xff0c;他描述了自己如何与一个才华横溢的团队合作&#xff0c;在这大语言模型与生成式AI的元年中致力于为客户提供最佳的…

ELK+filebeat+kafka

无需创建logstash的端口&#xff0c;直接创建topic 远程收集mysql和httpd的日志 &#xff08;一&#xff09;安装nginx和mysql服务 1、打开mysql的日志功能 2、创建日志&#xff08;创库、创表、添加数据&#xff09; &#xff08;1&#xff09;mysql服务器上安装http system…

医疗机构临床数据合规共享解决方案斩获“金智奖”年度优秀方案奖

11月24日&#xff0c;以“并肩聚力&#xff0c;协同创新&#xff0c;共谋网络安全产业新发展”为主题的2022—2023年度中国网络安全与信息产业“金智奖”&#xff08;以下简称&#xff1a;“金智奖”&#xff09;颁奖盛典隆重举行。美创科技—医疗机构临床数据合规共享解决方案…

synchronized 关键字

目录 1 synchronized 的特性 1&#xff09;互斥 2) 刷新内存&#xff08;内存可见性&#xff09; 3) 可重入 2 synchronized 使用示例 1) 直接修饰普通方法: 2) 修饰静态方法: 3) 修饰代码块: .3 Java 标准库中的线程安全类 1 synchronized 的特性 1&#x…

java之while循环

java之while循环 用法简介 用法简介 Java中的while循环是一种基本的控制流语句&#xff0c;它允许您在满足某个条件的情况下重复执行一段代码。以下是while循环的基本语法&#xff1a; while (condition) { // code to be executed while the condition is true }其中&…

Java数据结构之《链式线性表的插入与删除》问题

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等偏下的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我…

C++设计模式——建造者模式(Builder)

一、什么是建造者模式&#xff1f; 建造者模式是一种创建型的软件设计模式&#xff0c;用于构造相对复杂的对象。 建造者模式可以将复杂对象的构建与它的表示分离&#xff0c;使得相同的构建过程可以得到不同的表示。如果说工厂模式和抽象工厂模式更注重产品整体&#xff0c;…

程序员的吐槽

在职场中&#xff0c;每个人都可能遇到让自己不满的领导或同事。这位工作了7年的程序员&#xff0c;今天就要吐槽一下他职场中的种种不快。 一、领导的“关爱” 1. 瞎指挥 这位程序员所在的公司规模不大&#xff0c;领导对技术一窍不通&#xff0c;却喜欢对技术团队指手画脚。…

【开源】基于Vue+SpringBoot的智能教学资源库系统

项目编号&#xff1a; S 050 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S050&#xff0c;文末获取源码。} 项目编号&#xff1a;S050&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课…

Android中添加C或C++代码

1、创建cpp目录&#xff0c;用于存放C和C代码。 2、创建CMake构建脚本CMakeLists.txt文件&#xff0c;将其放在cpp目录中。 # Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.22.1)# Declares and names the pro…

AI模型训练——入门篇(二)

导语&#xff1a;本文主要介绍了基于BERT的文本分类方法&#xff0c;通过使用huggingface的transformers库实现自定义模型和任务。具体步骤包括&#xff1a;使用load_dataset函数加载数据集&#xff0c;并应用自定义的分词器&#xff1b;使用map函数将自定义分词器应用于数据集…

vue运用之el-cascader组件

前言 el-cascader 是 Element UI 的级联选择器组件。以下是一些常见的 el-cascader 问题以及对应的案例代码。 1. 如何使用 el-cascader 创建一个级联选择器 以下是一个简单的 el-cascader 示例: <template> <el-cascader v-model="selected" :option…