算法第十九天-二叉搜索树节点最小距离

news2024/9/24 23:19:46

二叉搜索树节点最小距离

题目要求

解题思路

今天题目重点:
1.二叉搜索树(BST)
2.任意两个不同节点
遇到二叉搜索树,立即想到这句话:[二叉搜索树(BST)的中序遍历是有序的]。这是解决所有二叉搜索树问题的关键。

要求BST的任意两个不同节点之间的最小差值,也就是相当于求BST中序遍历得到的有序序列中所有相邻节点之间的最小差值。

分享二叉树遍历的经验:先序、中序、后序遍历方式的区别在于把[执行操作]放在两个递归的位置。
伪代码如下:
1.先序遍历

def dfs(root):
    if not root:
        return
    执行操作
    dfs(root.left)
    dfs(root.right)

2.中序遍历

def dfs(root):
    if not root:
        return
    dfs(root.left)
    执行操作
    dfs(root.right)

3.后序遍历

def dfs(root):
    if not root:
        return
    dfs(root.left)
    dfs(root.right)
	执行操作

本题使用了中序遍历,所以把[执行操作]这一步改成自己想要的代码。

方法一、数组保存中序遍历结果
这个方法最直观,也最不容易出错。
1.先中序遍历,把结果放在数组中;然后对数组中的相邻元素求差,得到所有差值的最小值。

方法二、只保存上个节点
在方法一中,我们保存了整个中序遍历数组,比较浪费空间。
其实我们只需要知道,在中序遍历的时候的两个被依次访问的节点。注意,这里说的不是BST的相邻节点,因为在中序遍历时,在访问根节点前,上一个被访问的节点时其左子树的最优下的节点。所以我们只需要一个变量prev保存在中序遍历时,上一次被访问的节点。因为在中序遍历的过程中,节点的值是依次递增的,因此求差值的方式应该是root.val - prev.val,对该值取最小,就是BST任意两个节点的最小差值。
这里需要注意一个细节:中序遍历时的第一个节点,并没有prev节点。此时应该怎么办?其实就是不求第一个和上个节点的差值就行了。可以把prev初始化为None,遍历时对prev进行一个判断,如果prev为None,说明当前遍历的是中序遍历的第一个节点,跳过求差值;此后的遍历中,在每次求完diff之后,把prev设置为当前遍历的节点。

代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def minDiffInBST(self, root):
        self.vals = []
        self.inOrder(root)
        return min([self.vals[i + 1] - self.vals[i] for i in range(len(self.vals) - 1)])
    def inOrder(self, root):
        if not root:
            return 
        self.inOrder(root.left)
        self.vals.append(root.val)
        self.inOrder(root.right)

复杂度分析

时间复杂度: O ( N ) O(N) O(N)
空间复杂度: O ( N ) O(N) O(N)

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

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

相关文章

DNS主从服务器配置

主从服务器配置: (1)完全区域传送:复制整个区域文件 #主DNS服务器的配置【主dns服务器的ip地址为192.168.168.129】 #编辑DNS系统配置信息(我这里写的增加的信息,源文件里面有很多内容) [root…

新手做抖音小店如何选品?选什么样的品?这几点一定要记住

大家好,我是电商花花。 抖音小店如何选品?大家应该自己的选品方法和渠道,但是选品归根结底就是抓住用户的喜好,清楚他们想要什么样的商品,只有抓住用户的需求,客户才会买单,店铺才会出单。 所…

解决Vue 3 + Element Plus树形表格全选多选以及子节点勾选的问题

目录 前言 问题概述 解决方案 1. 创建树形表格 2. 实现全选功能 3. 实现多选功能 4. 实现子节点勾选 5. 实现父节点勾选 总结 前言 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊解决Vue 3 Element Plus树形表格全选多选以及子节…

鸿蒙开发(三)理解UIAbility

前文提到过,在使用DevEco创建鸿蒙项目的时候,会选择Empty Ability,那么这个Ability是什么呢?其实对比Android Studio创建Android羡慕时选择的Empty Activity,感觉Harmony的Ability更像是Android的Activity,…

无需编程,简单易上手的家具小程序搭建方法分享

想要开设一家家具店的小程序吗?现在,我将为大家介绍如何使用乔拓云平台搭建一个家具小程序,帮助您方便快捷地开展线上家具销售业务。 第一步,登录乔拓云平台进入商城后台管理页面。 第二步,在乔拓云平台的后台管理页面…

linux基础学习(3):挂载

挂载可以理解为给磁盘空间一个可访问的入口,那个入口称为挂载点,相当于windows中的盘符。 1.挂载命令mount 1.1直接输入mount 查看系统已挂载的设备 1.2挂载与卸载命令 mount -t 文件系统名 设备文件名 挂载点 | umount 挂载点 或 umount 设…

LabVIEW在微生物检测中的应用

随着对食品安全关注的增加,食品检测的准确性变得越来越重要。其中,微生物计数作为食品合格的关键指标,对其检测技术的准确性和实时性要求极高。传统的微生物检测面临着菌落识别困难、设备实时性差和自动化程度不高等问题,尤其在疫…

【shell】读取表格文件的数据

碎碎念 shell在处理复杂问题的时候不具备优势,如果业务环境能够使用python的话用python又简单又好用,但是很多云平台的现场可能需要shell脚本文件(还好是要求bash) 但是现在有一个业务场景就是运维人员会把参数写在excel表格中 …

java中String的两种创建方法、字符串常量池

java中String的两种创建方法 字符串常量池 字符串常量池 String的两种创建方式: 第一种方式是在常量池中获取字符串对象。第二种方式是直接在堆空间创建一个新的字符串对象。 //先检查字符串常量池中有没有“apesource”,如果字符产常量池中没有,则创建一个&#x…

基于dinoV2分类模型修改

前言 dinoV2已经发布有一段时间了,faecbook豪言直接说前面的结构我们都不需要进行修改,只需要修改最后的全连接层就可以达到一个很好的效果。我们激动的揣摸了下自己激动的小手已经迫不及待了,这里我使用dinoV2进行了实验,来分享…

c语言学习总结———编译和链接

再次来做一下学习总结,今天我们总结一下关于编译和链接的学习吧! 1. 翻译环境和运⾏环境 在ANSI C的任何⼀种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令。 第2种是执⾏环境&…

uni-app修改头像和个人信息

效果图 代码&#xff08;总&#xff09; <script setup lang"ts"> import { reqMember, reqMemberProfile } from /services/member/member import type { MemberResult, Gender } from /services/member/type import { onLoad } from dcloudio/uni-app impor…

postgresql迁移到mysql

1.工具方法&#xff1a;Navicat Premium16 2. 手工方法&#xff1a; 迁移流程 下面是将 Postgresql 数据库迁移到 MySQL 的步骤流程&#xff1a; 步骤描述1. 创建MySQL表结构在MySQL中创建与Postgresql中的表结构相同的表2. 导出Postgresql数据将Postgresql中的数据导出为SQ…

python下常用的爬虫模块

目录 一&#xff1a;requests 二&#xff1a;BeautifulSoup 三&#xff1a;Scrapy 四&#xff1a;Selenium 一&#xff1a;requests requests 是一个用于发送 HTTP 请求的 Python 库。它提供了简洁的 API 来发送各种类型的 HTTP 请求&#xff0c;如 GET、POST、PUT、DELETE…

SpringBoot异常处理(Whitelabel Error Page和自定义全局异常处理页面)和整合ajax异常处理

SpringBoot异常处理&#xff08;Whitelabel Error Page和自定义全局异常处理页面&#xff09;和整合ajax异常处理 1、springboot自带的异常处理页面Whitelabel Error Page SpringBoot默认的处理异常的机制&#xff1a;SpringBoot 默认的已经提供了一套处理异常的机制。一旦程…

【python】OpenCV—Histogram(9)

学习参考来自 Python下opencv使用笔记&#xff08;九&#xff09;&#xff08;图像直方图&#xff09; 更多学习笔记可以参考 【python】OpenCV—RGB&#xff08;1&#xff09;【python】OpenCV—Rectangle, Circle, Selective Search&#xff08;1.2&#xff09;【python】…

clickhouse join查询算法

算法对比&#xff1a; 使用方法&#xff1a; SELECT town,max(price) AS max_price,any(population) AS population FROM uk_xxx_paid JOIN uk_xxx_table ON lower(uk_price_paid.town) lower(uk_populations_table.city) GROUP BY town ORDER BY max_price DESC SETTINGS jo…

为什么我建议企业一定要自己的erp管理系统!

在商业世界中&#xff0c;企业就像是一艘船&#xff0c;需要在波涛汹涌的大海中稳稳地航行。然而&#xff0c;如果没有一套有效的管理系统&#xff0c;这艘船就可能迷失方向&#xff0c;甚至触礁沉没。对于那些没有引入ERP系统的企业来说&#xff0c;他们正面临着种种挑战。 信…

搭建储能监控云平台:实现能源管理的智能化

搭建储能监控云平台&#xff1a;实现能源管理的智能化 在全球能源变革的大背景下&#xff0c;储能技术的重要性日益凸显。储能监控云平台作为能源管理的智能解决方案&#xff0c;可以为企业提供全方位的储能系统监控与数据分析&#xff0c;提高能源利用率&#xff0c;降低能源成…

MiniTab的拟合回归模型的分析

拟合回归模型概述 使用拟合回归模型和普通最小二乘法可以描述一组预测变量和一个连续响应之间的关系。可以包括交互作用项和多项式项、执行逐步回归和变换偏斜数据。 例如&#xff0c;房地产评估人员想了解城市公寓与多个预测变量&#xff08;包括建筑面积、可用单元数量、建…