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

目录

问题描述

DFS(深度优先搜索)方案

BFS(广度优先搜索)方案

总结


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

问题描述

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

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

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

111.二叉树的最小深度

DFS(深度优先搜索)方案

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

  1. 基本情况:如果当前节点为空,返回0。
  2. 递归:分别对当前节点的左子树和右子树调用DFS,获取它们的最小深度。
  3. 比较:比较左子树和右子树的深度,取较小者加1(当前节点的深度)。
function minDepth(root) {// 基本情况:如果根节点为空,返回0,因为空树的深度是0if (root === null) {return 0;}// 如果左子树为空,只考虑右子树的深度if (root.left === null) {return minDepth(root.right) + 1; // 递归调用右子树,并将深度加1}// 如果右子树为空,只考虑左子树的深度if (root.right === null) {return minDepth(root.left) + 1; // 递归调用左子树,并将深度加1}// 如果左右子树都不为空,比较左右子树的深度,选择较小的深度,然后加1return 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.rhkb.cn/news/410456.html

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

相关文章

QJson的写入和解析基本操作

一、QJson简介 QJson 是一个用于处理 JSON(JavaScript Object Notation)数据的 C 库 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式 JSON 的语法简洁明了,使用人类可读的文本格式来表示数据 它由键值…

分块矩阵的转置

证明 则 证明:令,有,对它做一个分块使得和后面的分块矩阵中的是同型矩阵,要证明(任意的),需要证明1)是一个的矩阵 2)任意的 首先证明1)我们先定义两个函…

Getting RateLimitError while implementing openai GPT with Python

题意:“在使用 Python 实现 OpenAI GPT 时遇到 RateLimitError 错误。” 问题背景: I have started to implement openai gpt model in python. I have to send a single request in which I am getting RateLimitError. “我开始在 Python 中实现 Ope…

SSH弱口令爆破服务器

一、实验背景 1、概述 使用kali的hydra进行ssh弱口令爆破,获得服务器的用户名和口令,通过 ssh远程登录服务器。 2、实验环境 kali攻击机:192.168.1.107 centos服务器:192.168.1.105 二、前置知识 1、centos设置用户并设置弱…

HR招聘,如何解决面试流程繁琐的问题

要解决面试流程繁琐的问题,就必须要精简和优化招聘流程。比如精简面试环节,制定标准化流程,完善信息管理,对面试环节进行细致梳理之后,尽快识别并去除那些不必要的步骤,这样就能够减少求职者的等待时间&…

IAR软件配置笔记

Project->Optiions->配置Device Debug中配置 C/C Compiler中配置 优化等级 C语法标准选择 回到主界面,Tools->Options 字体调整 Editor更改缩进数 Project->Make编译 调试模式和编辑模式的View菜单栏不一样http://t.csdnimg.cn/JsWjy Disa…

Python | Linux | 解析Himawari-8/9 | Standard Data

写作前面 之前一个相关的工作需要解析Himawari-8/9 Standard Data文件,因为他是二进制的,之前没有处理过,导致完全摸不着头脑。在网上找了中英文搜索找了好久,虽然也找到了公开的解析代码,但是放在自己的数据这感觉总是…

Golang | Leetcode Golang题解之第375题猜数字大小II

题目&#xff1a; 题解&#xff1a; func getMoneyAmount(n int) int {f : make([][]int, n1)for i : range f {f[i] make([]int, n1)}for i : n - 1; i > 1; i-- {for j : i 1; j < n; j {f[i][j] j f[i][j-1]for k : i; k < j; k {cost : k max(f[i][k-1], f[…

字节跳动-生活服务-java后端-一面

基础题 计算机网络 1.tcp三次握手和四次挥手&#xff1f;tcp的第三次握手可以传输应用层数据嘛&#xff1f; 4.1 TCP 三次握手与四次挥手面试题 | 小林coding (xiaolincoding.com) 2.描述一下打开百度首页后发生的网络过程&#xff1f; 计算机网络面试题 | 小林coding (xi…

无损放大图片,盘点5款最新无损放大图片软件

我们常常遇到需要放大图片却又不希望损失画质的尴尬境地。无论是为了打印大幅海报、在线展示高清细节&#xff0c;还是想要修复珍贵的老照片&#xff0c;无损放大图片成为了许多人的迫切需求。下面给大家分享5款最新无损放大图片软件&#xff0c;高效且实用&#xff0c;一起来学…

C++基础练习

1》提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 1 #include<iostream>2 using namespace std;3 4 int main()5 {6 string str1; //定义字符串数据7 cout << "请输入一个字符串>>>" ;8…

好出创新点的方向:SAM做医学图像分割!轻松登Nature!

继MedSAM登上Nature后&#xff0c;牛津大学也最新提出了MedSAM-2&#xff0c;不但分割一切医学图像&#xff0c;还能分割视频&#xff01;准确度提升一个level&#xff0c;直接刷新医学图像分割SOTA榜&#xff01; 这种惊人的医学图像分割效果都得益于SAM模型&#xff08;尤其是…

【html+css 绚丽Loading】 000020 三才流转盘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

AList嵌入动态验证码实现动态校验

前言 晓杰利用ALists创建了个网盘资源站&#xff0c;想着如何增加个动态验证码进行验证后才能进行访问下载&#xff0c;刚开始利用了固定的验证码&#xff0c;用户可以通过JS代码中进行绕过或直接拿到验证码&#xff0c;经过晓杰多次优化&#xff0c;最终版本支持动态获取验证…

Redis 实现哨兵模式

目录 1 哨兵模式介绍 1.1 什么是哨兵模式 1.2 sentinel中的三个定时任务 2 配置哨兵 2.1 实验环境 2.2 实现哨兵的三条参数&#xff1a; 2.3 修改配置文件 2.3.1 MASTER 2.3.2 SLAVE 2.4 将 sentinel 进行备份 2.5 开启哨兵模式 2.6 故障模拟 3 在整个架构中可能会出现的问题 …

一道关于php文件包含的CTF题

一、源码 这是index.php的页面。 点击login后会发现url里多了action的参数&#xff0c;那么我们就可以通过它来获取源码。 ?actionphp://filter/readconvert.base64-encode/resourcelogin.php 再通过base64的解码可以查看源码。 index.php源码&#xff1a; <?php erro…

可拖拽表单设计器都有哪些突出特点?

为了提高效率、降低开发成本&#xff0c;利用低代码技术平台的优势特点可以实现这一目标。究竟什么是低代码技术平台&#xff1f;都有哪些值得夸耀的特点和优势&#xff1f;今天&#xff0c;我们就带着这些问题&#xff0c;一起来了解低代码技术平台、可拖拽表单设计器的多个优…

第一周学习--联邦学习

OUC读研--第一周 目录 1、课程学习 2、fedavg的算法实现 关于代码详解 1、client __init__ 方法 local_train 方法 2、server 3、get_dataset 函数定义 数据集加载 MNIST 数据集 CIFAR-10 数据集 返回值 使用示例 4、 main 代码解释 可能的改进点 5、models …

【项目实用】SpringBoot整合日志功能插件

​分享不易&#xff0c;耗时耗力&#xff0c;麻烦给个不要钱的关注和赞吧 承接毕设指导&#xff0c;技术答疑&#xff0c;学习路上缺少导师的同学可以私信我 更多学习资料&#xff0c;公众号&#xff1a;墨轩学习网&#xff0c;B站&#xff1a;墨轩大楼 一、日志概述 日志记录…

安装WMware和Ubuntu并使用xShell连接

0、我的电脑配置 设备名称 hello 处理器 Intel(R) Core(TM) i7-10700K CPU 3.80GHz 3.79 GHz 机带 RAM 16.0 GB (15.9 GB 可用) 设备 ID 541EC230-9910-418C-9043-5FBBF8ED320C 产品 ID 00330-80000-00000-AA846 系统类型 64 位操作系统, 基于 x64 的处理器 笔和触控 没有可…