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

递增顺序搜索树

题目要求

解题思路

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:returndfs(root.left)执行操作dfs(root.right)

3.后序遍历

def dfs(root):if not root:returndfs(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 = dummyfor node in self.res:node.left = node.right = Nonecur.right=nodecur = cur.rightreturn dummy.rightdef inOrder(self,root):if not root:returnself.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 = dummyself.inOrder(root)return dummy.rightdef inOrder(self,root):if not root:return Noneself.inOrder(root.left)root.left = Noneself.prev.right =rootself.prev =rootself.inOrder(root.right)

复杂度分析

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

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

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

相关文章

一网打尽所有主流平台的实时热榜

今日热榜 一网打尽所有主流平台的实时热榜https://tophub.today

LLM增强LLM;通过预测上下文来提高文生图质量;Spikformer V2;同时执行刚性和非刚性编辑的通用图像编辑框架

文章首发于公众号:机器感知 LLM增强LLM;通过预测上下文来提高文生图质量;Spikformer V2;同时执行刚性和非刚性编辑的通用图像编辑框架 LLM Augmented LLMs: Expanding Capabilities through Composition 本文研究了如何高效地组…

生活中的物理3——神奇陷阱(随机倒下的抽屉柜门)

1实验 材料:大自然(风)、抽屉门松掉的抽屉 实验 1、找一个大风的日子,打开窗户(不要找下雨天,不然你会被你亲爱的嫲嫲KO) 2、让风在抽屉面前刮过 3、你发现了什么??&…

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

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

【软件系统架构设计】期末复习题目汇总:简答+应用

电子科技大学软件系统架构设计2023年秋期末考试复习题目汇总 目录 系统分析与设计概述 面向对象建模语言 系统规划 系统需求分析 系统架构设计 软件建模详细设计 设计模式 用户界面设计 系统分析与设计概述 信息系统的 6 种类型,举例说明? 信息…

【Linux Shell】7. printf 命令

文章目录 【 1. printf 命令的使用方法 】【 2. 实例 】 【 1. printf 命令的使用方法 】 printf 命令模仿 C 程序库(library)里的 printf() 程序,printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。prin…

docker容器启动etcd3.5

目录 环境:(window11) 1、配置本地docker镜像地址配置成国内源: 1.1 docker-Desktop里面,增加这个部分内容: 1.2 修改docker的daemon.json文件一个效果: 2、dockerfile文件内容: 1、提前下载etcd3.5的…

AIGC初探:提示工程 Prompt Engineering

简介 提升工程是什么 提示工程(Prompt Engineering)是人工智能领域中的一个概念,特别是在自然语言处理(NLP)领域中。它是一种通过设计和优化输入提示来提高AI模型表现的方法。 对于基于转换器的大型语言模型&#x…

Wireshark本地回环网络抓包

背景 因为发往本机的数据包是通过回环地址的,即:数据包不会通过真实的网络接口发送,因此我们需要通过设置路由规则来让本来发到虚拟网络接口的数据包发送到真实网络接口即可。 场景描述:在网络程序开发的过程中,有时…

计算机Java项目|SpringBoot+Vue实现的在线考试系统

项目编号:L-BS-KS-02 一,环境介绍 语言环境:Java: jdk1.8 数据库:Mysql: mysql5.7 应用服务器:Tomcat: tomcat8.5.31 开发工具:IDEA或eclipse 二,项目简介 基于SpringBootVue的在线考试…

牢牢把握“心价比”,徕芬的业绩爆发是一种必然?

回顾徕芬的2023年 ,战果颇为丰硕:上半年就完成2022年全年的销售额,同比增长245%;用户增长超500万;多次取得线上销售量份额第一…… 虽然业绩突破背后也有消费复苏的激励作用,但具体到电吹风市场&#xff0…

一篇文章认识微服务中Eureka的原理和服务注册与发现

目录 1、认识Eureka 2、Eureka原理 2.1 和Dubbo架构对比: 2.2 三大角色 3、微服务常见的注册中心 3.1 Zookeeper 3.2 Eureka 3.3 Consul 3.4 Nacos 3.5 区别 Netflix 在设计Eureka 时,遵循的就是AP原则。 CAP原则又称CAP定理,指的…

SSM在线手机品牌商城----计算机毕业设计

项目介绍 该项目为前后台项目,分为普通用户与管理员两种角色,前台普通用户登录,后台管理员登录; 管理员角色包含以下功能: 管理员登录,用户管理,品牌管理,子品牌管理,商品管理,订单管理,留言板管理等功能。 用户角…

Eclipse先关的一些配置

启动配置设置 配置项详细说明: -Xms:初始堆内存大小,设定程序启动时占用内存大小,默认物理内存1/64 -Xms -XX:InitialHeapSiz-Xmx:最大堆内存,设定程序运行期间最大可占用的内存大小。如果程序运行需要…

KK集团高管变更:陈世欣任总经理,涉无证放贷遭关注,还曾被处罚

近日,KK集团关联公司广东快客电子商务有限公司(下称“KK集团”)发生工商变更,其中郭惠波不再担任该公司总经理一职,由陈世欣接任。而在早前,陈世欣曾于2020年取代吴悦宁担任总经理职务,2021年7月…

上帝视角俯视工厂设计模式

引言 本篇聊聊设计模式中的简单工厂、工厂方法、抽象工厂设计模式,争取在看完这篇后不会再傻傻分不清以及能够应用在实际项目中 背景 以一个咱们都熟悉的场景举个例子,我们平时都会戴口罩,用来过滤一些普通病毒,大致的设计如下…

C++矩阵例题分析(3):螺旋矩阵

一、审题 时间限制:1000ms 内存限制:256MB 各平台平均AC率:14.89% 题目描述 输出一个n*n大小的螺旋矩阵。 螺旋矩阵的样子: 输入描述 共一行,一个正整数n,表示矩阵变长的长度…

NGUI基础-Widget

目录 Widget是什么 Widget组件包含的属性 Pivot Depth Size snap Aspect Free Based on Width Based on Height Widget是什么 在Unity UI系统中,"Widget"是指UI元素的基类,它为UI元素提供了位置、大小和锚点等基本属性。通过使用&qu…

LeetCode 2:两数相加

一、题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个…

QT上位机开发(网络程序界面开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 传统的上位机对接方式还是以232、485、can为主,随着网络的发展,越来越多的设备都是以网络进行通信的。毕竟相比较之前&…