数据结构与算法(八)

news2025/6/29 23:01:02

二叉搜索树

二叉树:二叉树每个结点最多有两个子树

 

二叉搜索树: (BST) 其实就是在普通的二叉树上加了一些限制

没有任何限制,二叉搜索树插入子结点的时候有一些特殊的要求

二叉搜索树的性质:

  1. 非空左子树所有的键值小于其根结点的键值
  2. 非空右子树所有的键值大于其根结点的键值
  3. 左、右子树本身也都是二叉搜索树

二叉搜索树的特点:相对较小的值总是保存在左子结点,相对较大的值总是保存在右子结点上。

 二叉搜索树的遍历:先序遍历、中序遍历、后序遍历。

二叉搜索树的优点:可以快速的找到给定的关键字的数据项,快速的插入和删除数据。

二叉搜索树的缺陷:时间性能上是有局限性。

比较好的二叉搜索树的数据应该是左右分布均匀的。

但是我们在插入连续的数据的时候,会导致数据分布不均匀,不均匀的树我们称为:非平衡树

二叉平衡树

二叉平衡树:平衡二叉搜索树,也叫做AVL树,是一种自平衡的树。除了规定左结点小于根结点,有结点大于根结点以外,还规定了左子树和右子树的高度差不得超过1。

我们需要建立一棵尽可能矮的树平衡因子: 左子树的高度减去其右子树的高度

所以,平衡二叉树中,各个结点的平衡因子的绝对值小于等于1。 [-1,0,1] 。可以满足我们的二叉平衡树的需求,平衡二叉树是一棵二叉搜索树,只不过平衡树比较矮而已。

 

控制平衡因子:如果平衡因子的绝对值超过了1,那么我们就称之为:失衡,结点需要随时添加、随时删除

我们插入数据的时候,导致平衡二叉树出现了失衡。控制平衡因子,要把平衡因子控制在绝对值不大于1的范围内(平衡调整),在平衡二叉树中,使用旋转换作来达到平衡。

 

 

红黑树

AVL树相对于红黑树,它的插入/删除操作效率都不高。

R-B tree

红黑树是一种自平衡的二叉搜索树,以前叫做平衡二叉B树
红黑树增加的一些特性
1、结点是红色或者黑色。(结点上有一个color属性)

class Node {
    constructor(){
        this.color = 'black'
    }
}

2、根结点是黑色
3、叶子结点都是黑色,且为null (NIL结点)
4、连接红色结点的两个了结点都是黑色,红色结点的父结点都是黑色红色结点的了结点都是黑色
5、从任意结点出发,到其每个叶子结点的路径中包含相同数据的黑色结点

这5条性质就是红黑树给出的自动维持平衡所具备的规则

是为了保证: 从根节点到叶子结点的最长路径不大于最短路径的2倍

红黑树插入数据的时候。会先去遍历数据应该插入到哪个位置,插入的数据一定是红色的。

const RED = 'red';
const BLACK ='black';
class Node {
	constructor(index,value){
		this.index = index;
		this.value =  value;
		this.color = RED; // 新增加 默认红色
	}
}
this.color = BLACK

 

 

 

  

 

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

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

相关文章

Java的Atomic原子类

Java SDK 并发包里提供了丰富的原子类,我们可以将其分为五个类别,这五个类别提供的方法基本上是相似的,并且每个类别都有若干原子类。 对基本数据类型的变量值进行原子更新;对对象变量的指向进行原子更新;对数组里面的…

如何使用 Fail2ban 防止对 Linux 的暴力攻击?

在当今数字化世界中,网络安全成为了一个极其重要的话题。Linux 作为一种广泛使用的操作系统,也面临着各种网络攻击的风险,包括暴力攻击、密码破解和恶意登录等。为了保护 Linux 系统的安全,我们可以使用 Fail2ban 这样的工具来防止…

什么是日志关联

什么是日志关联 日志关联是一种分析来自不同源的日志数据以识别事件模式的技术。它用于更好地了解网络的活动,从而有效地保护网络免受漏洞和威胁。 日志关联是日志管理过程的关键部分。收集和存储日志后,集中式日志服务器将执行分析以检测特定事件。日…

Java Web 编写第一个Servlet程序全过程

一、工具准备 IDEATomcat 二、创建一个名为hello-servlet的maven项目 三、在工程根目录下创建一个web文件夹&#xff0c;web文件夹下创建WEB-INF目录&#xff0c;WEB-INF目录下创建web.xml文件&#xff0c;目录结构以及web.xml文件内容如下&#xff1a; <?xml version&qu…

AcrelEMS-HIM高速公路综合能效系统在新晋高速公路快村营至营盘段项目的应用

​安科瑞 耿敏花 摘 要&#xff1a;我国新型工业化、信息化、城镇化和农业现代化加快发展&#xff0c;经济结构加快转型&#xff0c;交通运输总量将保持较快增长态势&#xff0c;各项事业发展要求提高国家公路网的服务能力和水平。高速公路沿线的收费站、互通枢纽、服务区、隧道…

三年外包的血泪史,终于脱离苦海了~

外包给的不高&#xff0c;是真的不能去呀&#xff01; 先说一下我的个人情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近3年的功能测试点点点&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒…

C# WPF窗体设计器显示以及App.xaml文件打不开(VS 2022)

问题描述&#xff1a; 在项目中遇到了App.xaml设计器打不开以及窗体设计器不显示&#xff0c;只有代码&#xff0c;如图所示&#xff1a; 可以明显的看见左下角的设计器不见&#xff0c;但是用户控件又有设计器 解决方法&#xff1a; (一、App.xaml不能正常打开) ①清理项…

数字孪生智慧工厂可视化分析决策方案,打造智慧汽车工厂

智慧工厂是当前智能制造领域的热门话题之一&#xff0c;是一种集成数字技术、先进制造技术和现代管理技术的新型工厂模式。随着全球制造业的发展&#xff0c;智慧工厂逐渐成为未来工厂发展的一大趋势&#xff0c;越来越多的企业开始关注智慧工厂的建设。 该数字孪生智慧汽车工厂…

vue-cli4+vant+rem+sass+vuex+axios封装+webpack搭建前端项目

移动端项目模板 基于 vue-cli4.0 webpack 4 vant ui sass rem 适配方案axios 封装&#xff0c;构建手机端模板脚手架 启动项目 git clone https://github.com/teach-tian/h5-vue-cli4.gitcd h5-vue-cli4npm installnpm run serve✅ 配置多环境变量 package.json 里的 s…

Stimulsoft报表开发工具支持电子签名啦!一起来看

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

java 注解学习

Java 语言中存在三类注解&#xff0c;分别是元注解&#xff08;Meta-annotations&#xff09;、Java 内置注解&#xff08;Built-in Annotations&#xff09;和自定义注解&#xff08;Custom Annotations&#xff09;。 1、元注解&#xff08;Meta-annotations&#xff09; 元…

Pandas-如何对指定某列的NaN值进行替换或填充

前言 本文是该专栏的第31篇,后面会持续分享python数据分析的干货知识,记得关注。 笔者在本专栏之前有单独详细介绍过,使用Numpy对数组元素进行替换的方法,感兴趣的同学,可翻阅查看“Numpy-如何对数组的元素进行替换”。 而本文来单独介绍pandas对指定列的NaN值进行操作的…

《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序

《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序 题目1题目2题目3题目4题目5题目6总结 题目1 将下面的程序编译、连接&#xff0c;用 Debug 加载、跟踪&#xff0c;然后回答问题 assume cs:code, ds:data, ss:stack data segmentdw 0123h,0456h,0789h,0abch,0def…

github添加ssh-key来支持git项目管理

背景 https://github.com很多时候无法克隆/更新/提交项目&#xff0c;使用gitgithub.com怎没有限制 配置git账户邮箱和用户名 查看配置信息 git config --global --list 配置或者修改用户名&#xff0c;替换为自己github用户名 git config --global user.name "holyl…

【什么是苹果IM推?什么是苹果推?】iMessage推送操纵Apple Push Notification service (APNs)

以帮忙你明白实现iMessage推送的基本原理和步调&#xff1a; 开辟者账户&#xff1a;确保你具有苹果开发者账户&#xff0c;以便访谒苹果开发者中间和相干东西。 APNs认证&#xff1a;iMessage推送操纵Apple Push Notification service (APNs)来发送关照。在苹果开发者中心&a…

Spring支持哪些Aware接口?

Spring支持哪些Aware接口? Spring支持哪些Aware接口?Aware接口的优点ApplicationContextAware和BeanFactoryAware的区别 Spring支持哪些Aware接口? ApplicationContextAware:获取ApplicationContext对象BeanFactoryAware:获取BeanFactory对象BeanNameAware:获取Bean的名称E…

Fiddler抓取HTTPS最“全”攻略,让你成为网络调试大师!

对于想抓取HTTPS的测试初学者来说&#xff0c;常用的工具就是fiddler。 在使用Fiddler进行HTTPS抓包时&#xff0c;很多人都会遇到各种各样的问题和困难。 初学时&#xff0c;大家对于fiddler如何抓取HTTPS难免走歪路&#xff0c;也许你一步步按着网上的帖子成功了&#xff0…

Kubernetes 准入控制器

Kubernetes 极大地提高了当今生产中后端集群的速度和可管理性。由于灵活、可扩展、易用&#xff0c;Kubernetes 已成为容器编排的事实标准。Kubernetes 还提供了一系列保护功能。而 Admission Controllers&#xff08;准入控制器&#xff09; 是一组安全相关的插件&#xff0c;…

Failed to start application ‘/LM/W3SVC/7/ROOT‘, ErrorCode ‘0x800700c1‘.解决方案

dll相互干扰所致 关闭整个IIS服务 发布选项勾选删除现有文件 即可

Seata AT模式源码解析二(Seata Client端启动流程)

文章目录 初始化TM和RM数据源代理 由于我们一般都是在springboot中使用的&#xff0c;而与springboot集成的我们一般就先看starter的spring.factories文件&#xff0c;看看它的自动装配 这里面主要关注SeataAutoConfiguration和SeataDataSourceAutoConfiguration。 SeataAutoCo…