普通二叉树和右倾斜二叉树--LeetCode 111题《Minimum Depth of Binary Tree》

本文将以解释计算二叉树的最小深度的思路为例,致力于用简洁易懂的语言详细描述普通二叉树和右倾斜二叉树在计算最小深度时的区别。通过跟随作者了解右倾斜二叉树的概念以及其最小深度计算过程,读者也将对左倾斜二叉树有更深入的了解。这将为解决LeetCode 111题《Minimum Depth of Binary Tree》提供有力支持。最终,本文将提供LeetCode 111的解题代码。

题目内容-- Leetcode111. Minimum Depth of Binary Tree

Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. Note: A leaf is a node with no children.

例子1️⃣: 例子2️⃣

输入:root = [3,9,20,null,null,15,7]                    输入:root = [2,null,3,null,4,null,5,null,6]

输出:2                                                              输出:5

题目🔗链接

解题思路分析

  • 普通二叉树

    • 理解问题:首先,理解问题的要求。问题要求找到给定二叉树的最小深度,即从根节点到最近的叶子节点的最短路径上的节点数。
    • 考虑特殊情况:考虑特殊情况,比如空树或只有一个节点的树。对于这些情况,最小深度分别为0或1。
    • 使用递归:采用递归的方式来解决问题。从根节点开始,递归地计算左子树和右子树的最小深度。然后,最小深度是左右子树最小深度的较小值加上1。
    • 处理叶子节点:在递归过程中,需要特别注意处理叶子节点的情况。叶子节点的最小深度是1。

            下面是可能实现的伪代码:           

def minDepth(root):# 处理空树的情况if root is None:return 0# 处理叶子节点的情况if root.left is None and root.right is None:return 1# 计算左右子树的最小深度left_depth = minDepth(root.left)right_depth = minDepth(root.right)# 返回最小深度return min(left_depth, right_depth) + 1

因此,这个递归算法通过适当的处理,可以灵活地应对不同形态的二叉树,包括右倾斜二叉树和普通二叉树。                

  • 右倾斜二叉树

    1. 定义:右倾斜二叉树(Right-skewed binary tree)是一种特殊的二叉树结构,其中每个非叶子节点只有右子节点,而没有左子节点。这导致树的形状是向右倾斜的,呈现出一种链表的形式。
    2. 右倾斜二叉树的特点包括:(1)每个非叶子节点最多右一个子节点,且该子节点是右子节点。(2)左子树为空,右子树可能为空或者不为空。(3)从根节点到任意叶子节点的路径都只包含右子节点。
    3. 对于右倾斜二叉树,树中的每个节点都只有右子树,递归的方式可以稍微修改一下。在递归计算最小深度时,我们需要考虑到只有右子树的情况。以下的代码可以处理三种情况:(1)普通二叉树;(2)右倾斜二叉树;(3)以右倾斜二叉树开头+普通二叉树的混合结构。
      def minDepth(root):# 处理空树的情况if root is None:return 0# 递归计算右子树的最小深度right_depth = minDepth(root.right)# 如果左子树为空,说明只有右子树,返回右子树的最小深度加上1if root.left is None:return right_depth + 1# 如果左右子树都存在,返回左右子树最小深度的较小值加上1return min(minDepth(root.left), right_depth) + 1

      这样的实现考虑了右倾斜二叉树的情况,递归过程会一直沿着右子树向下进行,直到找到叶子节点。同样,返回的最小深度是左右子树最小深度的较小值加上1。

    4. 以上代码之所以能够处理普通二叉树和右倾斜二叉树的情况,是因为在递归计算最小深度的过程中,代码会考虑每个节点的左右子树情况,从而综合考虑了整个树的结构。分布解释为什么会有效:

      1. 递归基准:在递归函数中,首先处理了空树的情况,如果树为空,则返回深度0。

      2. 递归右子树:对于每个非空节点,递归计算右子树的最小深度。这是为了处理右倾斜二叉树,因为在右倾斜二叉树中,节点的左子树可能为空,而右子树不能为空。

      3. 处理只有右子树的情况:在右子树的计算过程中,如果发现左子树为空,那么说明该节点只有右子树,此时返回右子树的最小深度加上1。这是为了处理右倾斜二叉树中,只有右子树的情况。

      4. 处理左右子树都存在的情况:如果左右子树都存在,返回左右子树的最小深度的较小值加上1。这是为了处理普通二叉树的情况。因此,这个递归算法通过适当的处理,可以灵活地应对不同形态的二叉树,包括右倾斜二叉树和普通二叉树。

    5. 右倾斜二叉树示例:
            1\2\3\4
      

      在这个例子中,每个节点都只有右子节点,形成了一个向右倾斜的结构。这种树的高度等于节点的数量,因为每个节点都沿着右子节点一直向下。

    6. 混合结构的二叉树:以右倾斜二叉树开头 + 普通二叉树结构:如左图,混合结构二叉树的最小深度为6。使用上述代码计算最小深度时,它将递归计算右倾斜二叉树部分的深度,即节点数为4。然后,它将递归计算二叉树部分的深度,考虑到左右子树的情况,返回左右子树的最小深度的较小值加上 1。同理,右侧为9。
  • 左倾斜二叉树

    1. 为了通过Leetcode 111. Minimum Depth of Binary Tree所有的测试样例,提供能够处理普通二叉树和右倾斜二叉树的最小深度的方案还是不够,还需要能够处理左倾斜二叉树,以及左倾斜二叉树+普通二叉树的混合结构,
    2. 示例样例如下:root=[1,2]。
    3. 为此,我们参照右倾斜二叉树的定义和实现方式,得出来关于左倾斜二叉树的伪代码,如下:
      def minDepth(root):# 处理空树的情况if root is None:return 0# 递归计算左子树的最小深度left_depth = minDepth(root.left)# 如果右子树为空,说明只有左子树,返回左子树的最小深度加上1if root.right is None:return left_depth + 1# 如果左右子树都存在,返回左右子树最小深度的较小值加上1return min(left_depth, minDepth(root.right)) + 1
  • 整合思路和代码结果

  • 将以上思路整合起来,我们能得到一个可以解决以下7️⃣个方面的算法,并且能够解决LeetCode 111题《Minimum Depth of Binary Tree》。
    1. 普通二叉树
    2. 右倾斜二叉树
    3. 左倾斜二叉树
    4. 右倾斜二叉树开头+普通二叉树的混合结构
    5. 左倾斜二叉树开头+普通二叉树的混合结构 
    6. 左倾斜和右倾斜的混合结构
    7. 左倾斜或右倾斜二叉树开头+普通二叉树树+左倾斜或右倾斜二叉树混合结构
  • 将以上代码整合成能求解右倾斜,左倾斜和普通二叉树结构的最小树深度的伪代码如下:整合思路和代码结果:
    def minDepth(self, root):# 处理空树的情况if root is None:return 0# 递归计算右子树的最小深度right_depth = self.minDepth(root.right)left_depth = self.minDepth(root.left)# 如果左子树为空,说明只有右子树,返回右子树的最小深度加上1if root.left is None:return right_depth + 1# 如果右子树为空,说明只有左子树,返回左子树的最小深度加上1if root.right is None:return left_depth + 1 # 如果左右子树都存在,返回左右子树最小深度的较小值加上1return min(left_depth, right_depth)+1

  • 时间和空间复杂度

计算二叉树的复杂度涉及两个主要方面:时间复杂度和空间复杂度。这两个复杂度是对算法执行时间和所需内存的度量。

时间复杂度

时间复杂度表示算法执行所需的时间,通常以大O表示法表示。对于二叉树的操作,例如遍历、搜索或修改节点,时间复杂度通常取决于树的高度和节点数量。

在一般情况下:

  • 平均时间复杂度: 对于平均情况下的树,可以考虑使用平均深度和平均节点数来估算。
  • 最坏时间复杂度: 对于最坏情况下的树,通常考虑树的最大深度和节点数。

例如,对于二叉搜索树(BST),查找一个节点的平均时间复杂度为O(logn), 其中n是节点数。在最坏的情况下,树是不平衡的,时间复杂度可能为O(n),其中n是节点树。

空间复杂度

空间复杂度表示算法执行所需的内存空间,也通常以大O表示法表示。对于二叉树,空间复杂度主要取决于递归调用、栈的使用和其他额外数据结构的空间开销。

  • 递归的空间复杂度:在递归遍历二叉树时,递归调用栈的深度影响空间复杂度。平衡二叉树的递归深度通常为O(log n), 而不平衡二叉树的深度可能为O(n)。

  • 其他数据结构的空间复杂度:如果在算法执行中使用了其他数据结构(如队列、堆栈等),则需要考虑这些数据结构的空间开销。

综合考虑递归深度、节点数以及其他数据结构的使用,可以得到二叉树的总体空间复杂度。

需要注意的是,二叉树的具体操作和算法会影响复杂度的具体数值。在分析复杂度时,通常使用大 O 表示法来表示算法的渐进复杂度,即在输入规模趋于无穷大时的复杂度。

二叉树中的堆栈

在二叉树的操作和遍历中,堆栈(stack)通常用于以下几种情况:

  1. 递归(recursive)的实现:二叉树的深度优先搜索(DFS)通常使用递归来实现。递归函数的调用本质上就是使用了堆栈。在递归过程中,每一次递归调用都会将当前状态的信息(比如当前节点、访问过的节点等)压入堆栈,而递归返回时会从堆栈中弹出这些信息,使得递归能够回到上一层。
  2. 非递归的深度优先搜索:除了递归实现,深度优先搜索也可以使用显示的堆栈来模拟递归过程。在迭代版本的深度优先搜索中,通过维护一个堆栈,可以手动模拟递归调用的过程,将当前状态信息入栈、出栈、实现深度遍历。
  3. 迭代(iteration)的广度优先搜索:广度优先搜索(BFS)通常使用队列,但有时也可以使用堆栈,特别是在反向遍历的情况下。在迭代的BFS中,每层的节点可以按照逆序压入堆栈,使得出栈的顺序满足反向的BFS要求。
  4. 中序遍历的非递归实现:在二叉树的中序遍历中的左子树、根节点、右子树的顺序访问。

在这些情况下,堆栈的主要作用是在算法的执行过程中保存状态信息,以便在需要时能够回溯到之前的状态。这对于深度优先搜索、中序遍历等操作是非常有用的。在实际编程中,堆栈的使用可以显示的创建一个堆栈数据结构,也可以使用编程语言自身的调用栈来实现。

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

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

相关文章

BIM 技术:CIM (City Information Modeling) 1-7 级

本心、输入输出、结果 文章目录 BIM 技术:CIM (City Information Modeling) 1-7 级前言城市信息模型(CIM)概述城市信息模型分级介绍CIM 1CIM 2CIM 3CIM 4CIM 5CIM 6CIM 7 花有重开日,人无再少年实践是检验真…

【Linux】dump命令使用

dump命令 dump命令用于备份文件系统。使用dump命令可以检查ext2/3/4文件系统上的文件,并确定哪些文件需要备份。这些文件复制到指定的磁盘、磁带或其他存储介质保管。 语法 dump [选项] [目录|文件系统] bash: dump: 未找到命令... 安装dump yum -y install …

TableView复用机制的坑

TableView复用机制的坑 复用机制 UITableView 首先加载能够覆盖一屏幕的 UITableViewCell(具体个数要根据每个 cell 的高度而定)。 然后当我们往上滑动时(往下滑动同理),需要一个新的 cell 放置在列表的下方。此时&…

SpringBoot Starter机制(自定义Start案例,实际开发场景中的短信模拟,AOP实现日志打印)

前言: 在我们上一篇博客中,实现Freemarke的增删改查,今天分享的是关于SpringBoot Starter机制-- 1.SpringBoot Starter 1.1.什么是SpringBoot Starter SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂…

一款专业的磁盘坏道清除、彻底清除填充数据根据-硬盘数据彻底清除的方法分享

工具提供了硬盘坏道修复功能,你可以将损坏的磁盘放到软件分析,让软件找到错误的地方,让软件找到损坏的区域,通过内置的修复功能就可以将不能正常使用的部分恢复,从而让您的电脑磁盘可以保存很多数据,避免造…

Windows安装Tesseract OCR与Python中使用pytesseract进行文字识别

文章目录 前言一、下载并安装Tesseract OCR二、配置环境变量三、Python中安装使用pytesseract总结 前言 Tesseract OCR是一个开源OCR(Optical Character Recognition)引擎,用于从图像中提取文本。Pytesseract是Tesseract OCR的Python封装&am…

【python】Debian安装miniconda、spyder、tushare

1. miniconda 安装 — 动手学深度学习 2.0.0 documentation中有安装Miniconda的一些说明。 Miniconda — miniconda documentation是Miniconda网站,里面也有安装说明。 Debian安装按照linux安装即可: mkdir -p ~/miniconda3 wget https://repo.anaco…

macbookpro 2024怎么恢复出厂设置

可能你的MacBook曾经是高性能的代表,但是现在它正慢慢地逝去了自己的光芒?随着逐年的使用以及文件的添加和程序的安装,你的MacBook可能会开始变得迟缓卡顿,或者失却了以往的光彩。如果你发现你的Mac开始出现这些严重问题&#xff…

英语综合教程1第三版的一些题

unit1 unit2 unit3 unit4 unit5 unit6

3.1 内容管理模块 - 工程搭建、课程查询、配置Swagger、数据字典

文章目录 内容管理模块一、基础工程搭建1.1 需求分析1.2 业务流程1.3 数据模型1.4 创建模块工程1.4.1 介绍1.4.2 xuecheng-plus-content 聚合工程1.4.3 模块演示 二、课程查询准备2.1 需求分析2.1.1 业务流程2.1.2 数据模型 2.2 生成PO类2.2.1 新增Maven配置2.2.2 课程基本信息…

CSS的盒子模型(重点)

网页布局的三大核心:盒子模型、浮动、定位 网页布局的过程: 1. 先准备好相关的网页元素,网页元素基本都是盒子 Box 。 2. 利用 CSS 设置好盒子样式,然后摆放到相应位置。 3. 往盒子里面装内容.网页布局的核心本质: 就…

python+appium自动化常见操作

1、点击、输入操作 #点击 driver.find_element(id,com.lemon.lemonban:id/navigation_my).click() #输入 driver.find_element(id,com.lemon.lemonban:id/et_password).send_keys(abc)2、隐形等待 driver.implicitly_wait(10)3、显性等待 #显性等待 locator (xpath,xpath) wai…

技术分享 | Appium 用例录制

下载及安装 下载地址: github.com/appium/appi… 下载对应系统的 Appium 版本,安装完成之后,点击 “Start Server”,就启动了 Appium Server。 在启动成功页面点击右上角的放大镜,进入到创建 Session 页面。配置好 …

Python基础学习—Pandas数据分析实战剖析【文末送书-09】

文章目录 一.Pandas数据分析1.1 Pandas的主要应用包括:1.2 Pandas核心数据结构1.3 安装和导入Pandas 二.Pandas数据分析实战:用Python进行数据分析1. 数据集介绍2. 数据加载与初步观察3. 数据清洗4. 数据分析4.1 销售趋势分析4.2 热门商品分析 三.Pandas…

将开源免费进行到底,ThreadX开源电脑端GUIBuilder图形开发工具GUIX Studio

上个月微软刚刚宣布将ThreadX RTOS全家桶贡献给Eclipse基金会,免费供大家商用,宽松的MIT授权方式,就差这个GUIX Studio没有开源了,而且Windows还经常检索不到,并且也不提供离线包。 1、软件包有点大,700MB…

力扣第一题-两数之和[简单]

题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任…

分布式事务--分布式事务理论基础

1.本地事务 本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则: 2.分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如: 跨数据源的分布式…

《人工智能导论》知识思维导图梳理【第6章节】

文章目录 第六章 知识图谱1 知识图谱概述2 知识图谱相关概念3 知识图谱的逻辑结构4 知识图谱的数据存储5 知识图谱的构建过程6 例题 markdown内容的分享 第六章 知识图谱 1 知识图谱概述 2 知识图谱相关概念 3 知识图谱的逻辑结构 4 知识图谱的数据存储 5 知识图谱的构建过程 6…

【LeetCode: 2415. 反转二叉树的奇数层 | BFS + DFS】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

超过 1450 个 pfSense 服务器因错误链而遭受 RCE 攻击

在线暴露的大约 1450 个 pfSense 实例容易受到命令注入和跨站点脚本漏洞的攻击,这些漏洞如果链接起来,可能使攻击者能够在设备上执行远程代码。 pfSense 是一款流行的开源防火墙和路由器软件,允许广泛的定制和部署灵活性。 它是一种经济高效…