高阶数据结构-----三种平衡树的实现以及原理(未完成)

news2024/10/2 22:26:12

TreeMap和TreeSet的底层实现原理就是红黑树

一)AVL树:

1)必须是一棵搜索树:前提是二叉树,任取一个节点,它的左孩子的Key小于父亲节点的Key小于右孩子节点的Key,中序遍历是有序的,按照Key的大小进行排列,高度平衡的二叉搜索树,他的左右子树都是二叉搜索树

          A
    B             C
甲    乙      丙      丁

我们在这里面得出一个结论: Key(甲)<Key(B)<Key(乙)<Key(A)<Key(丙)<Key(C)<Key(丁)

2)必须是一颗平衡树:任意树中的节点,要求结点左子树的高度和结点右子树的高度差的绝对值不可以超过1,左右子树的高度差不能超过1;

平衡因子=左子树的高度-右子树的高度,我们在AVL树中任取一个节点,他的平衡因子只能是-1,1,0;

3)AVL树任意一颗以根节点的左右子树的高度差的绝对值不超过1,所以AVL树尽量保证左树和右树的高度是一致的,那么这个时候再次进行数据查找的时间复杂度就是O(logN)

4)当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过,(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度

二)AVL树的查找与插入:如果插入失败了,那么只有一种情况那么就是当前我要插入的数值在原来的树中已经有了

随着节点的插入,导致了平衡因子发生了变化,所以我们要进行平衡因子的调节

1)如图所示,在上面这张图中当我们想要插入10这个节点的时候,parent此时指向的是9这个节点,此时10插入到了9的右子树,那么9的平衡因子++,此时parent的平衡因子是1,但是只能证明当前这棵树已经平衡了,还是需要进行向上调整

2)此时如果插入的数据是8.5,那么此时插入到的位置是9的左边,此时parent的平衡因子是-1,此时也是只能证明当前这棵树平衡了,还是需要继续向上调整的;

3)但是如果此时我们进行插入的数据是7.5,那么此时parent节点指向8这个位置,成功插入7.5这个数据之后发现parent的平衡因子变成0,此时就不需要向上调整了

当parent.bf==2的时候,说当前这棵树已经不平衡了,说明此时右树高,说明要降低右树的高度,增加左树的高度,所以要进行旋转

当parent.bf==-2的时候,说当前这棵树已经不平衡了,说明此时左树高,说明要降低左树的高度,增加右树的高度,所以要进行旋转

左旋说明右树高,右旋说明左树高

一)parent节点的平衡因子是2,current节点存储的平衡因子是1:

二)parent结点的平衡因子是2,current的节点的平衡因子是-1;
三)parent结点存储的平衡因子是-2,current存储结点的平衡因子是-1;

1)这个旋转也叫做右单旋,除了修改指针的指向还有修改平衡因子,右单旋就是自己变成左孩子的右孩子

2)但是代码写到这里面还是存在着一定问题,可能当前的parent是上面某一棵树的左子树,也有可能是某一棵树的右子树

3)最后修改各个节点的平衡因子

4)但是上面的所有情况都考虑得比较不错了,但是最终的代码还是存在着一定的瑕疵

四)parent存储结点的平衡因子是-2,current存储结点的平衡因子是1;  

右单旋:(新节点插入较高左子树的右侧)

左旋——自己变为右孩子的左孩子;右旋——自己变为左孩子的右孩子

 

 在上面的代码中,我们就成功地进行了右旋;

左单旋:新节点插入较高右子树的右侧

左右双旋:新节点插入到较高左子树的右侧

解决方案:先针对parent的左子树进行左旋,再根据parent结点进行右旋,再进行更新平衡因子的变化

右左双旋:新节点插入到较高右子树的左侧

验证AVL树:中序遍历有序况且是平衡二叉树

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

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

相关文章

WINGREEN 034STM4-00-200-RS 输入输出模块

WINGREEN 034STM4-00-200-RS 输入输出模块是一种工业自动化设备&#xff0c;通常用于各种应用领域&#xff0c;以实现数字输入和输出功能。这些模块可以在不同行业的自动化系统中发挥关键作用&#xff0c;以下是一些可能的应用领域&#xff1a; 制造业&#xff1a;WINGREEN 034…

kubeadm搭建kubernetes(k8s)

kubeadm搭建kubernetes&#xff08;k8s&#xff09; 一、环境准备1.所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换2.修改主机名3.所有节点修改hosts文件4.调整内核参数5.生效参数 二、 安装软件1.所有节点安装docker2.所有节点安装kubea…

机器学习开源工具BatteryML,一站式分析与预测电池性能

编者按&#xff1a;天下苦锂电池寿命久矣&#xff0c;时闻“开车出&#xff0c;推车回”&#xff0c;又闻“充电两小时&#xff0c;待机两分钟”&#xff0c;亦闻“气温骤降&#xff0c;请注意电池保暖”……随着以锂离子电池为动力源的产品&#xff0c;如手机、电脑、新能源汽…

基于Java+SpringBoot+Vue前后端分离人事管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

软路由vs传统路由器ip:选择合适的网络设备

在构建和管理网络基础设施时&#xff0c;选择正确的网络设备至关重要。本文将介绍软路由IP和传统路由器两种常见的网络设备&#xff0c;并探讨它们各自特点、优势以及应用场景&#xff0c;帮助读者了解并选择最适合他们需求的网络设备。 什么是软路由IP&#xff1f; 软路由IP是…

vscode软件中不显示文件前的图标

问题&#xff1a; 解决方案&#xff1a; 效果&#xff1a;

专家解读 | 电力行业关基测评安全防护新挑战

在赛宁网安主办的安全运营实践论坛上&#xff0c;中国电力科学研究院信通所网安室测评主管、高级测评师肖红阳以《电力行业关基测评实践和经验交流》为主题发表演讲。他强调“电力行业关键信息基础设施是国家网络安全保护工作的重中之重”&#xff0c;并围绕电力关基测评的背景…

仓储24代电子标签接口文档

电子标签标签注册 通过手动触发电子标签注册到系统&#xff0c;注册成功就可以进行功能测试。 仓储24代注册 注册成功显示rssi:-xxdB如下&#xff1a; 绝对值越小信号越差&#xff0c;一般0 ~ -75dB都可以正常通讯 查询电子标签信息接口 接口描述 查询注册到系统的电子标签的…

八、性能测试之磁盘分析

性能测试之磁盘分析 一、磁盘简介1、存储数据之前&#xff0c;要先进行格式化2、读写数据时&#xff0c;数据与磁盘间有个磁盘缓存&#xff08;内存的一部分&#xff09;3、磁盘&#xff1a;持久化的存储设备4、磁盘读写操作流5、磁盘组成6、磁盘分区7、磁盘阵列RAID&#xff0…

记录Echarts双Y轴左右刻度不一致问题

根据项目需要,echarts实现双Y轴图表。因为两边数据不同&#xff0c;所以会出现左右Y轴刻度不一致。 增长率暂时是0&#xff0c;在X轴上&#xff0c;懒得改了。 修改之前: 修改之后: 根据数据找出最大值&#xff0c;分为6份向上取整&#xff0c;得到的每份就是间隔。 // dataAr…

直播预告 | CAR-T疗法红海赛道如何胜出?CAR-T工艺开发及商业化新思考

直播背景 随着整个细胞治疗行业的快速发展&#xff0c;CGT产业链上下游不断完善&#xff0c;从上游原材料及设备供应商到CXO再到创新药企&#xff0c;各个环节的联系更加紧密&#xff0c;竞争与合作关系愈加凸显。细胞药物研发过程中&#xff0c;对生物试剂、耗材、仪器设备有…

基于springboot的图片文字识别,支持中英文识别

概述 基于springboot的图片文字识别,支持中英文识别. 页面上传图片即可转换为中文或者英文. 详细 1.需求&#xff08;要做什么&#xff09; 识别图片文字, 实现页面上传图片即可转换为中文或者英文. 2.理论概述 OCR&#xff0c;即Optical Character Recognition&#xff…

机器学习-k-近邻算法

k-近邻算法 一、k-近邻算法概述1.1 使用python导入数据1.2 从文本文件中解析数据 二、使用k-近邻算法改进约会网站的配对效果2.1 准备数据2.2 数据预处理2.3 分析数据2.4 测试算法2.5使用算法 三、手写体识别系统 一、k-近邻算法概述 k-近邻算法是一种常用的监督学习算法&…

百度智能云千帆大模型平台2.0来了!从大模型到生产力落地的怪兽级平台!!

目录 前言 最佳算力效能为企业降低门槛 最多大模型&#xff0c;最多数据集为企业保驾护航 企业级安全对于企业来说是硬性要求 前言 普通人或许感知不明显&#xff0c;但是对于企业而言&#xff0c;身处AI时代&#xff0c;是否选择投资大模型&#xff0c;是否拥抱人工智能…

既然有 HTTP 协议,为什么还要有 RPC

HTTP和RPC 什么是HTTP HTTP协议&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff0c;又叫做超文本传输协议。平时上网在浏览器上敲个网址就能访问网页&#xff0c;这里用到的就是HTTP协议。 什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;&…

详解Vision Transformer中的Encoder

一.Transformer架构 左半边是Encoder&#xff0c;右半边是Decoder。 二.Vision Transformer Vision Transformer取了Transformer的左半边。包含 Input EmbeddingPositional Encoding多头注意力机制 Add & Norm(前馈网络)Feed Forward Add & Norm 2.1 Input Embe…

Python 完美解决 Import “模块” could not be resolved ...

首先扩展安装Python插件 Ctrl Shift P&#xff0c;在打开的输入框中输入 Python: Select Interpreter 搜索&#xff0c;选择 Python 解析器。 选好解析器后&#xff0c;就可以直接在 VS Code 里运行&#xff08;快捷键 Ctrl F5&#xff09;或调试&#xff08;快捷键 F5&…

打造高效等级查询系统

在现代教育体系中&#xff0c;考试等级查询系统是学生、家长和校园必不可少的工具。易查分是一款功能强大、易于使用的在线成绩查询平台&#xff0c;可以帮助学生和家长方便查询学生的考试成绩和等级&#xff0c;了解学习情况&#xff0c;从而更好的制定学习计划和提供必要的支…

leetcode(力扣):203移除链表元素 leetcode(力扣):206反转链表 leetcode(力扣):876.链表的中间结点多种解法

目录 203.移除链表元素 解法一&#xff1a;将目标元素前一个元素存放地址改为下一元素地址 解法二&#xff1a;遍历原链表&#xff0c;把不是val的节点拿出来进行尾插到新链表​编辑 解法三&#xff1a;有哨兵位解法->头节点不存储有效数据​编辑 206.反转链表 方法一…

一次说清楚BCD编码

背景 在银行报文中&#xff0c;有很多用到BCD编码的地方&#xff0c;BCD编码和常见的二进制编码或者ASCII编码又有区别&#xff0c;所以很容易搞错&#xff0c;弄错概念&#xff0c;下面笔者就一次把BCD编码讲清楚。 一&#xff0c;概念 1&#xff0c;BCD编码&#xff0c;…