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

2024-08-26 18:12

本文主要是介绍前端算法 === 力扣 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. 初始化:创建一个队列,将根节点入队。
  2. 循环:只要队列不为空,执行以下操作:
    • 取出队列中的所有节点,记为当前层。
    • 对于当前层的每个节点,检查其左右子节点:
      • 如果一个节点没有左子节点或右子节点,返回当前层的深度。
      • 如果有子节点,将子节点加入队列。
  3. 层级计数:每处理完一层,深度计数器加1。
function minDepth(root) {if (!root) return 0;const queue = [[root, 1]];let depth = 1;while (queue.length) {const [node, d] = queue.shift();if (!node.left && !node.right) return d;if (node.left) queue.push([node.left, depth + 1]);if (node.right) queue.push([node.right, depth + 1]);}
}

总结

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

这篇关于前端算法 === 力扣 111 二叉树的最小深度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109300

相关文章

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

html 滚动条滚动过快会留下边框线的解决方案

《html滚动条滚动过快会留下边框线的解决方案》:本文主要介绍了html滚动条滚动过快会留下边框线的解决方案,解决方法很简单,详细内容请阅读本文,希望能对你有所帮助... 滚动条滚动过快时,会留下边框线但其实大部分时候是这样的,没有多出边框线的滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

使用Python和Tkinter实现html标签去除工具

《使用Python和Tkinter实现html标签去除工具》本文介绍用Python和Tkinter开发的HTML标签去除工具,支持去除HTML标签、转义实体并输出纯文本,提供图形界面操作及复制功能,需... 目录html 标签去除工具功能介绍创作过程1. 技术选型2. 核心实现逻辑3. 用户体验增强如何运行

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue