前端算法 === 力扣 111 二叉树的最小深度

news2024/9/23 15:33:07

目录

问题描述

DFS(深度优先搜索)方案

BFS(广度优先搜索)方案

总结


力扣(LeetCode)上的题目111是关于二叉树的最小深度问题。这个问题可以通过深度优先搜索(DFS)和广度优先搜索(BFS)两种方法来解决。下面我将分别对这两种方法进行讲解。

问题描述

给定一个二叉树,找出它的最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

本题还有一个误区,题目中说的是:最小深度是从根节点到最近叶子节点的最短路径上的节点数量。,注意是叶子节点。

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

111.二叉树的最小深度

DFS(深度优先搜索)方案

DFS是一种自顶向下的搜索策略,它从根节点开始,尽可能深地搜索树的分支。在这个问题中,我们可以递归地遍历二叉树的每个节点,直到到达叶子节点。

  1. 基本情况:如果当前节点为空,返回0。
  2. 递归:分别对当前节点的左子树和右子树调用DFS,获取它们的最小深度。
  3. 比较:比较左子树和右子树的深度,取较小者加1(当前节点的深度)。
function minDepth(root) {
  // 基本情况:如果根节点为空,返回0,因为空树的深度是0
  if (root === null) {
    return 0;
  }

  // 如果左子树为空,只考虑右子树的深度
  if (root.left === null) {
    return minDepth(root.right) + 1; // 递归调用右子树,并将深度加1
  }

  // 如果右子树为空,只考虑左子树的深度
  if (root.right === null) {
    return minDepth(root.left) + 1; // 递归调用左子树,并将深度加1
  }

  // 如果左右子树都不为空,比较左右子树的深度,选择较小的深度,然后加1
  return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
}
  • root:当前正在考虑的节点。
  • root.left 和 root.right:当前节点的左子节点和右子节点。
  • minDepth(root.left) 和 minDepth(root.right):递归调用函数本身,分别计算左子树和右子树的最小深度。
  • Math.min(...):选择两个深度中的较小值。
  • +1:因为我们在计算从根节点到叶子节点的路径长度,所以每经过一个节点,深度就加1。

递归的美妙之处在于它能够自然地处理树结构,每次递归调用都处理树的一个分支,直到达到叶子节点,然后逐层返回,直到得到整个树的最小深度。这种方法直观且易于理解,特别是对于树结构的问题。

BFS(广度优先搜索)方案

BFS是一种自底向上的搜索策略,它从根节点开始,逐层遍历树的所有节点。在这个问题中,我们可以使用队列来实现BFS。

  1. 空树处理:如果根节点为空,直接返回0,因为空树的最小深度是0。

  2. 初始化队列:创建一个队列q,并将根节点及其深度1作为队列的第一个元素。这里的1表示根节点到自身的“深度”。

  3. 广度优先搜索:使用一个while循环来遍历队列,直到队列为空。这个循环利用了广度优先搜索(BFS)的策略,逐层访问树中的节点。

  4. 节点处理:在循环中,每次从队列中取出一个节点及其对应的深度。使用解构赋值const [n, l] = q.shift();来获取队列中的第一个元素。

  5. 叶子节点判断:检查取出的节点n是否没有左子节点和右子节点(!n.left && !n.right)。如果是叶子节点,说明找到了从根到叶子的最短路径,返回当前的深度l

  6. 子节点入队:如果当前节点不是叶子节点,检查它的左子节点和右子节点。如果存在左子节点,将其和新的深度(当前深度加1)一起加入队列。同样,如果存在右子节点,也将其和新的深度加入队列。

  7. 循环继续:重复步骤5-7,直到队列为空,此时意味着已经访问了所有可能的最短路径,并找到了最小深度。

var minDepth = function (root) {
  if (!root) {
    return 0;
  }
  const q = [[root, 1]];
  while (q.length) {
    const [n, l] = q.shift();
    if (!n.left && !n.right) {
      return l;
    }
    if (n.left) q.push([n.left, l + 1]);
    if (n.right) q.push([n.right, l + 1]);
  }
};

总结

DFS和BFS都是解决这个问题的有效方法。DFS的优点是代码简单,但可能在某些情况下效率不如BFS。BFS通常更直观,因为它逐层遍历树,而且对于这个问题,BFS可以更快地找到最小深度,因为它会在找到第一个叶子节点时立即停止搜索。然而,BFS需要额外的存储空间来存储队列。根据具体问题和场景,你可以选择适合的方法。

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

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

相关文章

Start OpenAI gym on arbitrary initial state

题意:“在任意初始状态下启动 OpenAI Gym” 问题背景: Anybody knows any OpenAI Gym environments where we can set the initial state of the game? For example, I found the MountainCarContinuous-v0 can do such thing so that we can select a…

游戏+AI

我们来聊聊AI【作者声明,个人观点,欢迎友好讨论】 我想这也是很多目前为止很多投资者对于AI举旗不定,不敢投资,业内游戏行业目前正式商用产品也是寥寥无几。 AI全称Artificial Intelligence,中文译名人工智能。人类从工…

信息打点-Web架构篇域名语言中间件数据库系统源码获取

知识点: 1、打点-Web架构-语言&中间件&数据库&系统等 2、打点-Web源码-CMS开源&闭源售卖&自主研发等 CMS:网站程序源码是可以通过搜索引擎搜索到并且下载的; 闭源售卖:不是一个开源的,要么从内…

【网络安全】分析重置密码功能实现账户接管

未经许可,不得转载。 文章目录 正文正文 目标为“target.com”,我执行了一些正常操作,比如创建或删除某些内容来保存 API 请求,然后检查是否存在任何 idor 或访问控制错误。然而,我没发现漏洞。 接着,我读取 JavaScript 文件来检查是否存在任何敏感信息,但一无所获。 …

浅谈 @Transtational 原理 及其失效场景(1)

上篇讲述了 当Transtctional遇到Async遇碰撞出怎样的火花? 本篇则主要从Transtational出发仔细谈谈。 一、调用场景复现,代码层面什么情况会失效? 1)同类操作:事物A调取非事物B,A报错/B报错(事…

流体力学解迷宫

诶,我手机呢?我手机放哪了?我手机是不是落餐厅了?会议室?厕所? 最近脑子有点不好使,可能需要练一练……解解迷宫吧 怕脑子吃不消,从简单的开始,不错,轻松拿…

EEtrade:黄金首饰是不是越软越好

黄金一直以来都是人们喜爱的贵金属之一。许多人在购买黄金首饰时,常常会关注黄金的纯度和硬度。那么,黄金首饰是不是越软越好呢?本文将详细探讨这个问题,并分析黄金首饰的硬度与其使用和美观性的关系。 黄金的纯度与硬度 黄金纯度 黄金的…

Linux系列之基础篇

文章目录 开篇明义基础篇实际操作篇高级篇Linux之JavaEELinux在哪些地方使用Linux应用领域 Linux入门基本介绍Linux和Unix关系 VM和Linux的安装基本说明安装VM17.5安装Centos7.6网络连接解释 虚拟机克隆虚拟机快照虚拟机迁移和删除安装vmtools设置共享文件夹 Linux目录结构 开篇…

屏幕翻译app下载哪个?高效学习工作必备

新学期即将开始,无论是线上学习还是筹备假期的海外交流,面对满屏的外文资料,一款得心应手的屏幕翻译软件成为必备利器。 幸运的是,现在有许多免费且功能强大的屏幕翻译工具,能够让你的学习与旅行更加顺畅。 以下是五…

Win7 配置Oracle 11G R2、PLSQL Development、添加用户名、远程访问数据库

本教程所有操作均在VMWare虚拟机上操作,Oracle这种又难装、又难卸、污染性这么大的程序,怎么会让他出现在我的生产环境中呢?自己在虚拟机上新建了一个Win7_x64的系统,进行Oracle安装测试。 1.Oracle文件的获取 网上有很多下载这…

LabVIEW便携涡流检测系统开发

针对便携式脉冲涡流检测系统的开发需求,使用LabVIEW进行软件设计与实现。系统需要集成对铁磁性和非铁磁性材料的检测功能,并提供友好的用户界面,便于操作与数据读取。 硬件选型: 脉冲涡流主机: 选择理由: …

【Liunx入门】Liunx换源

文章目录 前言一、备份默认源文件1.配置文件路径2.备份源文件 二、换源1.查看Ubuntu版本2.镜像源地址1)清华源2)阿里源3)中科大源 3.换源 三、更新镜像源总结 前言 由于Liunx系统默认的下载源为国外的源,所以在国内下载资源比较慢…

1+X 职业技能等级证书面向哪些人群介绍

日前,“大数据应用开发(Python)”职业技能等级证书已开放面向社会人员招生。 什么是1X职业技能等级证书? “1” 学历证书,代表专业,即学历、毕业 “X” 若干职业技能等级证书,是根据…

虫情系统的重要作用

在农业生产、林业管理和生态保护的广阔领域中,虫情监测系统如同一双锐利的眼睛,时刻关注着农田中的细微变化,为农作物的健康生长保驾护航。这一系统的引入,不仅标志着农业管理向智能化、准确化迈出了重要一步,更在提升…

vue postcss postcss-pxtorem 页面自适应 动态

vue postcss postcss-pxtorem 页面自适应 动态 postcss-pxtorem实现页面自适应1、安装postcss-pxtorem2、根目录创建postcss.config.js,并配置以下内容3、创建rem.js,动态设置root px4、在main.js中引入rem.js5、在main.js中创建全局处理函数px2rem6、对…

上海亚商投顾:沪指震荡微涨 固态电池、折叠屏概念股集体大涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡,黄白二线分化明显,微盘股指数涨超2.5%,题材概念较为活跃…

【渗透测试】ATTCK靶场一,phpmyadmin,域渗透,内网横向移动攻略

前言 博客主页:h0ack1r丶羽~ 从0到1~ VulnStack,作为红日安全团队匠心打造的知识平台,其独特优势在于全面模拟了国内企业的实际业务场景,涵盖了CMS、漏洞管理及域管理等核心要素。这一设计理念源于红日安全团队对ATT&CK红队评…

VBA之正则表达式(47)-- 快速将公式转换为静态值计算

实例需求:工作表I列包含多种计算公式,为了便于演示,将I列公式显示在J列单元格中,现在需要将公式的单元格引用转换为静态值,如K列所示。 示例代码如下。 Sub RegExpDemoReplace()Dim Res()Dim objRegEx As ObjectDim o…

零基础5分钟上手亚马逊云科技-NLP文字理解AI服务

简介: 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…

android gradle 配置国内gradle地址

1. 地址: 腾讯云镜像 Gradle下载地址:https://mirrors.cloud.tencent.com/gradle/ 阿里云镜像 Gradle下载地址:https://mirrors.aliyun.com/macports/distfiles/gradle/ 阿里云镜像 Gradle下载地址:https://mirrors.aliyun.com…