算法第十一天-递增顺序搜索树

递增顺序搜索树

题目要求

解题思路

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. 先中序遍历,把结果放在数组中;
    2.然后修改数组中每个节点的左右指针:把节点的左指针设置为null,把节点的右指针设置为数组的下一个节点。

下面代码中,使用了dummy(哑节点),它一般在链表题中出现。在链表题目中,我们为了防止链表的头节点发生变化之后,不好维护头节点,我们设置dummy从而保证头节点不变。这个题目中设置了dummy,从而保证了在新的树中,dummy,从而保证了在新的树中,dummy是根节点,最终返回的时候,要返回的是dummy.right.

代码
# 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:
    ## 通过数组进行保存中序遍历结果
    ## 时间复杂度:O(N);空间复杂度:O(N)
    def increasingBST(self, root: TreeNode) -> TreeNode:
        self.res=[]
        self.inOrder(root)
        if not self.res :
            return 
        dummy = TreeNode(-1)
        cur = dummy
        for node in self.res:
            node.left = node.right = None
            cur.right=node
            cur = cur.right
        return dummy.right
    def inOrder(self,root):
        if not root:
            return
        self.inOrder(root.left)
        self.res.append(root)
        self.inOrder(root.right)
复杂度分析

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

方法二:

在方法一中,我们保存了整个中序遍历数组,比较浪费空间。其实我们只需要知道,在中序遍历的时候的两个被依次访问的节点。注意,这里说的不是BST的相邻节点,因为在中序遍历时,在访问根节点前,上一个被访问的节点时其左子树的最右下角的节点。如下图所示,访问 节点4 之前,访问的是 节点3
在这里插入图片描述

所以我们只需要一个变量prev保存在中序遍历时,上一次被访问的节点。那么我们每次遍历的时候:

  • 把当前节点root.left设置为null;
  • prev.right设置为当前遍历的节点root
  • 把当前root设置为prev

这样子的话,就保证了在中序遍历的过程中的访问顺序,形成了一个新的只有右孩子的树。
上图中,在完成中序遍历之后,新的树的结构就是按照图中的红色箭头.
代码中同样的,我们设置一个dummy节点当作新的树的根节点,并把它作为默认的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 increasingBST(self, root: TreeNode) -> TreeNode:
        dummy=TreeNode(-1)
        self.prev = dummy
        self.inOrder(root)
        return dummy.right
    def inOrder(self,root):
        if not root:
            return None
        self.inOrder(root.left)
        root.left = None
        self.prev.right =root
        self.prev =root
        self.inOrder(root.right)

复杂度分析

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小H靶场笔记:DC-4

DC-4 January 4, 2024 2:37 PM Tags: teehee提权 Owner:只惠摸鱼 信息收集 探测靶机ip,发现应该是192.168.199.134 扫一下开放端口(22、80)、服务、版本、漏洞 根据扫描结果,在80端口可能有CSRF漏洞,…

关于目标检测任务中,YOLO(txt格式)标注文件的可视化

1. 前言 本文是针对yolo标注格式txt文件的可视化脚本介绍 如果是VOC格式的xml文件,参考:关于目标检测任务中,XML(voc格式)标注文件的可视化 代码比较简单, 50行这样 。。。。 下面是代码的目录结构,1.jpeg 是数据…

Jenkins接口调用

Jenkins是好用,但是接口文档写的稀烂 1、授权,Jenkins不推荐使用创建单个任务时创建的token,推荐这个用户下的创建user token。 点击自己账号信息,即可创建token。 2、postman选择basic auth,输入账号密码&#xff0…

有网友希望我推荐几个创建产品手册工具,这不就来了!

上次我有说到,企业应该充分认识到产品手册的重要性,并采取有效的策略和措施来制作和传播高质量的产品手册,以提升品牌知名度和市场份额。后台有网友问我除了设计排版的那种产品手册工具,还有什么方式可以去做产品手册。今天就介绍…

力扣题:高精度运算-1.4

力扣题-1.4 [力扣刷题攻略] Re:从零开始的力扣刷题生活 力扣题1:306. 累加数 解题思想:首先先通过secondStart和secondEnd可以确定num1 num[0:secondStart],num2 num[secondStart:secondEnd],然后遍历secondStart和secondEnd…

鸿蒙系列--动态共享包的依赖与使用

一、前言 HarmonyOS的共享包相当于Android的Library,在HarmonyOS中,给开发者提供了两种共享包,HAR(Harmony Archive)静态共享包,和HSP(Harmony Shared Package)动态共享包 区别&…

Android ValueAnimator属性动画ObjectAnimator使View颜色渐变,Kotlin

Android ValueAnimator属性动画ObjectAnimator使View颜色渐变,Kotlin 设置背景颜色渐变: private var iv: ImageView? nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activit…

Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连(C#) Baumer工业相机Baumer工业相机的图像转换为OpenCV的Mat图像的技术背景在NEOAPI SDK里实现相机图像转换为Mat图像格式联合OpenCV实现相机图像转换为Mat图像格式测试演示图 工业相机…

macOS系统卡顿光标转圈圈

macOS系统卡顿转圈圈 可以试试以下方法,(也可能是其他原因)仅供参考,不好使别骂我 当电脑出现卡顿,可以尝试清理缓存目录 点击访达你的用户名字上的磁盘,点击系统 点击这个资源库,然后找到【…

全网最全fiddler使用教程和fiddler如何抓包(fiddler手机抓包)-笔者亲测

一、前言 抓包工具有很多,比如常用的抓包工具Httpwatch,通用的强大的抓包工具Wireshark.为什么使用fiddler?原因如下: 1.Wireshark是通用的抓包工具,但是比较庞大,对于只需要抓取http请求的应用来说,似乎…

Spring整合MyBatis项目代码示例

文章目录 Spring整合MyBatis项目代码示例1、创建如下结构的项目Spring_MyBatis2、在pom.xml文件中添加以下依赖并刷新maven3、在resources文件夹下添加spring等配置文件(applicationContext.xml,db.properties,log4j.properties)4…

x-cmd pkg | procs - ps 命令的现代化替代品

目录 简介首次用户功能特点类似工具进一步阅读 简介 procs 是用 Rust 编写的 ps 替代品,用于显示有关任务进程的信息 首次用户 使用 x procs 即可自动下载并使用 在终端运行 eval "$(curl https://get.x-cmd.com)" 即可完成 x 命令安装, 详情参考 x-cmd…

基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码

基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于闪电搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

Zernike多项式法生成相位理论推导及图像引导实现原理

目录 引言 波前传感器 ​编辑 关于相位计算问题补充 关于结构图的修正 光束质量评价指标 Zernike多项式 ​编辑Zernike多项式法生成相位 光强分布求波前相位-GS 更快的迭代方法SPGD 基于Zernike模式的SPGD 引言 我们还是先从第一篇文献开始理解展开今天分享的一些重…

Linux-端口、nmap命令、netstat命令

端口是设备与外界通讯交流的出入口,可分为物理端口和虚拟端口 物理端口实际存在可以看见,而虚拟端口是指计算机内部的端口,是不可见的,用来操作系统和外部交互使用。 IP地址不能锁定程序,所以可以通过端口&#xff0…

圣诞节来临,如何用海外云手机给亚马逊店铺引流?

马上就要到圣诞节了,这是一年中冲刺销售量的最后一个好机会,对所有亚马逊卖家都十分重要。而无论是亚马逊新手卖家还是老卖家,要想在激烈的竞争中取胜,仅仅靠产品本身是不现实的,通过测评和社媒引流获取更多曝光和流量…

提升效率必备:用关键词替换法重命名文件夹技巧

在日常生活和工作中,经常要处理大量的文件夹,进行归类、整理和重命名。但是手动一个个重命名文件夹既费时又费力。为了提高效率,可以采用关键词替换法来批量重命名文件夹。现在讲解云炫文件管理器如何用关键词替换命名文件夹的具体步骤。 首先…

【Linux进程】 进程的理解

目录 前言 1. 系统管理 2. 进程 2.1 概念 2.2 进程的调度 2.3 描述进程-PBC 3. 查看进程 4. 通过系统调用获取进程标示符 前言 在计算机科学领域,进程是一种重要的概念,在日常学习中也经常遇到进程这个概念,那么进程到底是什么&#x…

Keras实现seq2seq

概述 Seq2Seq是一种深度学习模型,主要用于处理序列到序列的转换问题,如机器翻译、对话生成等。该模型主要由两个循环神经网络(RNN)组成,一个是编码器(Encoder),另一个是解码器…

使用mysql查询当天、近一周、近一个月及近一年的数据以及各种报表查询sql

1.mysql查询当天的数据 1 select * from table where to_days(时间字段) to_days(now()); 2.mysql查询昨天的数据 1 select * from table where to_days(now( ) ) - to_days( 时间字段名) < 1 3.mysql查询近一个月的数据 1 SELECT * FROM table WHERE date(时间字段) …