数据结构(6)

2-3查找树

2-结点:含有一个键(及其对应的值)和两条链,左链接指向2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。

3-结点:含有两个键(及其对应的值)和三条链,左链接指向的2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的两个键之间,右链接指向的2-3树中的键都大于该结点。

 查找:判断一个键是否在树中,先和根节点的键比较,如果相等,查找命中,如果不同,根据比较结果,在其子树中继续查找。还是空连接,查找未命中。

插入:

1.向2-结点插入:首先进行查找,将结点挂载未找到的结点上,如果未找到的结点是一个2-结点,将新元素放到里面变成3-结点。

2.向3-结点插入:将元素放入3-节点,变成4-结点,将4-结点中间元素提升,小于中间元素作为左节点,大于中间元素作为右结点。树的高度加1。

3.向父节点为2-结点,子结点为3-结点中插入:将元素插入3-结点中,变成临时的4-结点。将结点中的中间元素提升到2-结点中,父节点从2-结点变成3-结点,将左右元素挂载到适当的位置。

4.向父子结点为3-结点中插入:将元素插入子结点3-结点中,变成临时的4-结点。提升中间元素将父节点从3-结点变成4-结点,将左右元素放到适当位置。将父节点中的中间元素提升,直到遇到一个父节点是2-结点,将其变成3-结点为止,就可以了。

5.当插入时,所有结点都是3-结点时,将根节点变成一个临时4-结点,将根节点拆分成两个2-结点。树高度+1.

性质:

1.任意空链接到根结点的路径长度都是相等的。
2. 4-结点变换为3-结点时,树的高度不会发生变化,只有当根结点是临时的4-结点,分解根结点时,树高+1。
3. 2-3树与普通二叉查找树最大的区别在于,普通的二叉查找树是自顶向下生长,而2-3树是自底向上生长。        

直接实现2-3查找树较为复杂,但是其概念有利于红黑树、B树、B+树。

红黑树

红黑树主要是对2-3树进行编码,红黑树背后的基本思想是用标准的二叉查找树(完全由2-结点构成)和一些额外的信息(替换3-结点)来表示2-3树。我们将树中的链接分为两种类型:
红链接:将两个2-结点连接起来构成一个3-结点; 黑链接:则是2-3树中的普通链接。

红黑树定义:

1. 红链接均为左链接;
2. 没有任何一个结点同时和两条红链接相连;
3. 该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同;

其实就是将3-结点中的两个键分开,中间用红色连接

private class Node<Key,Value>{
//存储键
public Key key;
//存储值
private Value value;
//记录左子结点
public Node left;
//记录右子结点
public Node right;
//由其父结点指向它的链接的颜色
public boolean color;
public Node(Key key, Value value, Node left,Node right,boolean color) {
this.key = key;
this.value = value;
this.left = left;
this.right = right;
this.color = color;
}
}

对红黑树进行增删改时,可能出现两条红链接,需要进行旋转修复。

1.左旋

场景:某个结点的左子节点为黑色,右子节点为红色,需要左旋

左旋过程:
1.让x的左子结点变为h的右子结点:h.right=x.left;
2.让h成为x的左子结点:x.left=h;
3.让h的color属性变为x的color属性值:x.color=h.color;
4.让h的color属性变为RED:h.color=true;

 2.右旋

场景:某个结点的左子节点以及左子节点的左子节点都是红链接。

右旋过程:
1. 让x的右子结点成为h的左子结点:h.left = x.right;
2. 让h成为x的右子结点:x.right=h;
3. 让x的color变为h的color属性值:x.color = h.color;
4. 让h的color为RED;

 插入

1.向单个2-结点中插入:新键小于当前结点的键时,新增红色结点。如果大于新增红色右链接,左旋。

 

 2.向底部的2-结点插入:在树的底部新增一个结点,通过红链接相连,父节点为2-结点时,上面方法使用。

3.颜色反转:当一个结点的左右子结点为红链接时,将左右链接变成黑链接,与父节点的链接变成红链接。

4.向3-结点中插入:大于结点中的两个键时,向右插入,颜色反转;小于两个键时,向左插入,右旋,颜色反转;介于两个键中间,在中间插入,左旋,右旋,颜色反转。

5.向底部3-结点插入:新节点链接是3-结点的右链接,只需要转换颜色;左链接时,右旋,颜色转换;中链接时,左旋,右旋,颜色转换。

左旋:

private Node rotateLeft(Node h) {
//找出当前结点h的右子结点
Node hRight = h.right;
//找出右子结点的左子结点
Node lhRight = hRight.left;
//让当前结点h的右子结点的左子结点成为当前结点的右子结点
h.right = lhRight;
//让当前结点h称为右子结点的左子结点
hRight.left = h;
//让当前结点h的color编程右子结点的color
hRight.color = h.color;
//让当前结点h的color变为RED
h.color = RED;
//返回当前结点的右子结点
return hRight;
}

右旋:

private Node rotateRight(Node h) {
//找出当前结点h的左子结点
Node hLeft = h.left;
//找出当前结点h的左子结点的右子结点
Node rHleft = hLeft.right;
//让当前结点h的左子结点的右子结点称为当前结点的左子结点
h.left = rHleft;
//让当前结点称为左子结点的右子结点
hLeft.right = h;
//让当前结点h的color值称为左子结点的color值
hLeft.color = h.color;
//让当前结点h的color变为RED
h.color = RED;
//返回当前结点的左子结点
return hLeft;
}

颜色反转:

private void flipColors(Node h) {
//当前结点的color属性值变为RED;
h.color = RED;
//当前结点的左右子结点的color属性值都变为黑色
h.left.color = BLACK;
h.right.color = BLACK;
}

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

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

相关文章

python中的matplotlib画散点图(数据分析与可视化)

python中的matplotlib画散点图&#xff08;数据分析与可视化&#xff09; import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns",None) plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]Fa…

完全免费的GPT,最新整理,2023年8月24日,已人工验证,不用注册,不用登录,更不用魔法,点开就能用

完全免费的ChatGPT&#xff0c;最新整理&#xff0c;2023年8月24日&#xff0c;已人工验证&#xff0c; 不用注册&#xff0c;不用登录&#xff0c;更不用魔法&#xff0c;点开就能用&#xff01; 第一个&#xff1a;网址地址统一放在文末啦&#xff01;文末直达 看上图你就能…

Spring Boot+Atomikos进行多数据源的分布式事务管理详解和实例

文章目录 0.前言1.参考文档2.基础介绍3.步骤1. 添加依赖到你的pom.xml文件:2. 配置数据源及其对应的JPA实体管理器和事务管理器:3. Spring BootMyBatis集成Atomikos4. 在application.properties文件中配置数据源和JPA属性&#xff1a; 4.使用示例5.底层原理 0.前言 背景&#x…

YOLO目标检测——足球比赛中球员检测数据集下载分享

足球比赛中球员检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片格式为jpg&#xff0c;共500张图片 数据集点击下载&#xff1a;YOLO足球比赛中球员检测数据集500图片.rar

前端进阶Html+css10----定位的参照对象(高频面试题)

1.relative的参照对象 1&#xff09;元素按照标准流进行排布&#xff1b; 2&#xff09;定位参照对象是元素自己原来的位置&#xff0c;可以通过left、right、top、bottom来进行位置调整&#xff1b; 2.absolute&#xff08;子绝父相&#xff09; 1&#xff09;元素脱离标准流…

校园跑腿小程序开发方案详解

校园跑腿小程序App的功能有哪些&#xff1f; 1、用户注册与登录 用户可以通过手机号、社交账号等方式进行注册和登录&#xff0c;以便使用跑腿服务。 2、下单与发布任务 用户可以发布各类跑腿任务&#xff0c;包括食品外卖、快递代收、文件送达、帮我买、帮我取、帮我送等等…

【Java转Go】快速上手学习笔记(五)之Gorm篇

目录 go get命令1、go get命令无响应问题2、Unresolved dependency错误 连接数据库连接.gomain.go 操作数据库创建表新增数据更新数据删除数据查询数据单表查询多表查询 用到的数据库表原生SQL 完整代码 go往期文章笔记&#xff1a; 【Java转Go】快速上手学习笔记&#xff08;…

【ag-grid-vue】基本使用

ag-grid是一款功能和性能强大外观漂亮的表格插件&#xff0c;ag-grid几乎能满足你对数据表格所有需求。固定列、拖动列大小和位置、多表头、自定义排序等等各种常用又必不可少功能。关于收费的问题&#xff0c;绝大部分应用用免费的社区版就够了&#xff0c;ag-grid-community社…

MATLAB打开excel读取写入操作例程

本文使用素材含代码测试用例等 MATLAB读写excel文件历程含&#xff0c;内含有测试代码资源-CSDN文库 打开文件 使用uigetfile函数过滤非xlsx文件&#xff0c;找到需要读取的文件&#xff0c;首先判断文件是否存在&#xff0c;如果文件不存在&#xff0c;程序直接返回&#x…

线上问诊:业务数据采集

系列文章目录 线上问诊&#xff1a;业务数据采集 文章目录 系列文章目录前言一、环境准备1.Hadoop2.Zookeeper3.Kafka4.Flume5.Mysql6.Maxwell 二、业务数据采集1.数据模拟2.采集通道 总结 前言 暑假躺了两个月&#xff0c;也没咋写博客&#xff0c;准备在开学前再做个项目找…

elementui表格嵌套上传文件直传到oss服务器(表单上传)

提示&#xff1a;记录项目中遇到的问题&#xff0c;仅供参考 文章目录 前言一、vue代码二、js接口请求代码 前言 项目需求是在表格中嵌套一个上传图片的功能&#xff0c;并且回显选择的图片和已上传的图片&#xff0c;再通过点击操作列中上传按钮才开始上传&#xff0c;使用的…

如遭遇DDoS等攻击会对企业和个人造成严重影响,包括以下

1. 服务不可用&#xff1a;正常用户无法访问目标服务器&#xff0c;导致业务中断&#xff0c;影响用户体验。 2. 数据泄露&#xff1a;攻击者可能会在攻击过程中窃取用户数据&#xff0c;导致隐私泄露和财产损失。 3. 经济损失&#xff1a;由于服务中断&#xff0c;企业可能遭受…

C语言刷题训练DAY.12

1.统计成绩 解题思路&#xff1a; 这里我们设置两个变量记录最大值和最小值&#xff0c;再用一个sum统计分数总和即可。 解题代码&#xff1a; #include<stdio.h> int main() {int n 0;scanf("%d", &n);double arr[100] { 0 };int i 0;//最高分double …

postgresql 数据排序

postgresql 常见操作 排序总结 排序 -- 排序的时候null是最大的值(看一下) select employee_id,manager_id from employeesorder by manager_id desc;-- nulls first使null值排在第一位 select employee_id,manager_id from employeesorder by manager_id nulls first;-- null…

财务数据分析用什么软件好?财务数据分析的几个重要数据是什么?

财务的数据分析也分很多种的&#xff0c;就拿最粗略的划分来说&#xff0c;也可以分为3大领域—— 财务数据处理类工具财务数据挖掘类工具财务数据可视化工具 01 数据处理类 在财务数据处理这一块儿&#xff0c;不用说&#xff0c;当然是以excel为主力的数据处理类工具—— …

Protobuf在IDEA中的插件安装教程

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

海思Hi3861L开发三-新建自定义项目

一、简介 上一篇文章,介绍了如何下载安装SDK,并且编译和下载。但都是基于SDK原生提供的demo。那本节我们就来介绍一下,如果创建一个自己的项目。 二、新建目录结构 先看SDK提供的目录结构,如下图: 因为是基于应用的开发,所以我们只关注app这个文件夹。可以看到…

纠缠辅助的量子网络:原理、技术、发展与挑战

7月11日&#xff0c;中国科大网络空间安全学院和陆军院士工作室李忠辉博士为第一作者、薛开平教授为通讯作者的量子网络综述论文“Entanglement-Assisted Quantum Networks: Mechanics, Enabling Technologies, Challenges, and Research Directions”在通信领域知名期刊《IEEE…

Ext JS 之Microloader(微加载器)

“Microloader”是 Sencha 数据驱动的 JavaScript 和 CSS 动态加载器的名称。 清单 app.json 用于应用的设置,Sencha Cmd 在构建的时候会读取这个文件。 Sencha Cmd 转换“app.json”的内容并将生成的清单传递给 Microloader 以在运行时使用。 最后,Ext JS 本身也会查阅运…

c++学习之内存管理

目录 1.c/c内存分布 2.new与delete/malloc与free c内存管理方式&#xff1a; new/delete操作内置类型&#xff1a; new/delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 内置类型 自定义类型 malloc/free和new/delete的区别 1.c/c内存分…