红黑树与平衡二叉树_奈学:红黑树(RedBlackTree)的概述

2023-10-26

1. AVL树与红黑树

AVL树是一种自平衡的二叉查找树,又称平衡二叉树。AVL用平衡因子判断是否平衡并通过旋转来实现平衡,它的平衡的要求是:所有节点的左右子树高度差不超过1。AVL树是一种高平衡度的二叉树,执行插入或者删除操作之后,只要不满足上面的平衡条件,就要通过旋转来保持平衡,而的由于旋转比较耗时,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况。
由于维护这种高度平衡所付出的代价可能比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树。
红黑树(Red Black Tree),它一种特殊的二叉查找树,是AVL树的特化变种,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
红黑树的平衡的要求是:从根到叶子的最长的路径不会比于最短的路径的长超过两倍。 因此,红黑树是一种弱平衡二叉树,在相同的节点情况下,AVL树的高度<=红黑树。
红黑树是用弱平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,降低了对旋转的要求,从而提高了性能,所以对于查询,插入,删除操作都较多的情况下,用红黑树。

2. 红黑树的定义

AVL树的定义如下:

  1. 它一定是一棵二叉排序树;
  2. 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,递归定义。

相对于AVL树,红黑树的定义明显更加复杂:

  1. 它一定是一棵二叉排序树;
  2. 每个节点或者为黑色或者为红色;
  3. 根节点一定为黑色;
  4. 如果一个节点是红色的,那么它的子节点要么是null要么是黑色的(也就是说,不能有两个相邻的红色节点,即红色节点的父、左子、右子节点只能是黑色节点)。
  5. 对于每个节点,从该节点到其所有叶子节点的路径中都包含相同数量的黑色节点

根据上面的定义,可以推算出:

  1. 因为黑色节点数量要一样,红色不能连着来,从而路径全黑时最短,红黑交替时最长。因此可以推算出:红黑树从根到叶子节点的最长的路径不会比于最短的路径的长超过两倍。红黑树是一种弱平衡二叉树,在相同的节点情况下,AVL树的高度<=红黑树。
  2. 红黑树的高度最坏情况下为2log(N+1)。因此它也可以在O(log n)时间内做查找,插入和删除。

有一些红黑树定义还有一个性质:“红黑树中叶子节点为最后的空节点,并且每个叶子节点是黑色的”。该定义并不会对之前的定义产生影响,其目的更多是为了简化平衡操作的情况,平衡时可以认为:null就是黑色节点。此时只需要考虑红和黑这两种情况就行,而不用考虑非红非黑的null。
如下图(源自网络):

3. 红黑树的应用

红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。
实际上,Robert Sedgewick在《算法(第4版)》 中说过,红黑树等价于2-3树。其中2-节点等价于普通平衡二叉树的节点,3-节点本质上是非平衡性的缓存。
也就是说在添加、删除节点之后需要重平衡时,相当于2-节点 与3-节点间的转换,由于3-节点的缓存作用,能够吸收一部分不平衡性,从而减少旋转次数,减少重平衡时间。
尽管由于红黑树的最大高度高于AVL树导致此查询时稍慢,但是差距不大,而添加、删除数据时红黑树快于AVL树,红黑树的旋转次数为O(1),即最多旋转3次;而AVL的旋转次数为O(logN),即最多向上旋转至根节点。整体来看,红黑树的综合效率高于AVL树,红黑树比AVL树的应用范围更广泛!
AVL的应用:

  1. Windows NT内核

红黑树的应用:

  1. JDK1.8及之后版本的Map实现,比如HashMap、TreeMap。
  2. 广泛用于C++的STL中,map和set都是用红黑树实现的.
  3. 著名的linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块,进程的虚拟内存区域都存储在一颗红黑树上,每个虚拟地址区域都对应红黑树的一个节点,左指针指向相邻的地址虚拟存储区域,右指针指向相邻的高地址虚拟地址空间.
  4. IO多路复用epoll的实现采用红黑树组织管理sockfd,以支持快速的增删改查.
  5. ngnix中,用红黑树管理timer,因为红黑树是有序的,可以很快的得到距离当前最小的定时器。

文章来源于:奈学开发者社区,如有侵权,请联系我删除~

红黑树(RedBlackTree)的概述-奈学教育​ask.naixuejiaoyu.com 奈学开发者社区_专业IT技能学习平台-奈学教育​ask.naixuejiaoyu.com
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

红黑树与平衡二叉树_奈学:红黑树(RedBlackTree)的概述 的相关文章

  • uniapp开发h5,修改原生导航栏,自定义按钮

    关于修改原生导航栏样式的官方文档 添加自定义按钮只有app和h5才可以 pages pages数组中第一项表示应用启动页 参考 https uniapp dcloud io collocation pages path pages bloo
  • Ubuntu 安装 OpenCV4

    参考 ubuntu环境 安装opencv4 ubuntu安装opencv4 jbyyy 的博客 CSDN博客 目录 1 下载OpenCV 2 安装依赖 3 配置 CMake 交叉编译 OpenCV 4 编译 OpenCV 5 系统配置 环境
  • springcloud-alibaba-组件库

    架构选型 技术选型 包格式 公共配置 Springcloud Alibaba 简介 概述 下载 安装nacos 下载 手册 安装 配置 MySQL 数据库 启动集群 防火墙 访问 升级nacos1 x 到 2 x 防火墙 nginx 安装g
  • BES2300x笔记(38) -- 耳机与充电盒数据交互

    哈喽大家好 这是该系列博文的第三十八篇 篇 lt lt 系列博文索引 快速通道 gt gt 一 前言 蓝牙耳机的发展 从一开始的单个挂耳式耳机 到后来的颈挂式耳机 再到现在的TWS耳机 续航 一直都是个大问题 充电盒的诞生 不仅解决了TWS
  • vue + element ui 流文件导出 post or get , 文件下载等 合集

    1 vue element ui 的 get 方法导出数据 let params JSON parse JSON stringify this filterForm let exportUrl 清除为空的字段 for const key i
  • Postman如何做接口测试:如何导入 swagger 接口文档

    在使用 postman 做接口测试过程中 测试工程师会往界面中填入非常多的参数 包括 url 地址 请求方法 消息头和消息体等一系列数据 在请求参数比较多的情况下非常花时间 我们可以使用 postman 的文档导入功能 直接导入 swagg
  • HTML_and_CSS

    HTML知识 1 html概念 html全称HyperText Markup Language 翻译为超文本标记语言 它不是一种编程语言 是一种描述性的标记语言 用于描述超文本内容的显示方式 比如字体 颜色 大小等 超文本 音频 视频 图片
  • MVC 和Spring MVC

    MVC 和Spring MVC 我们都知道常说的MVC指的是 Model View Controller 数据模型 视图 控制器 三层架构指的是 展现层 应用层 数据访问层 但是Spring MVC却不是指的上面的三层架构而是将展现层拆分成
  • 项目开发流程图

    项目开发流程图 抽空总结了下项目开发流程 大多数公司应该都沿用这个流程方式
  • Spire.Office for Java 8.9.5/Spire.Office 8.9.2 .NET

    Spire Office for NET is a combination of Enterprise Level Office NET API offered by E iceblue It includes Spire Doc Spir
  • VHDL棋类竞赛设计(一)

    设计要求 竞赛计时分两个阶段 每方50秒的规定用时和每方每步8秒的读秒 1 可分别显示甲乙双方规定用时阶段的已用时间和读秒阶段 8秒 的倒计时 2 设置两路输入模拟双方落子 在规定用时阶段 一路信号有效时会暂停本方计时并继续对方计时 而在读
  • 当easyui datagrid无数据时,显示特定值。如:没有数据

    lt html gt lt head gt lt meta charset UTF 8 gt lt title gt Basic DataGrid jQuery EasyUI Demo lt link rel stylesheet type
  • golang context使用reflect遍历获取所有的key和value

    golang中我们经常和context打交道 context实际上可以保存值 源码参见 usr local go src context context go context包中实际上有好几种私有的context类型 type emptyC
  • SpringCache笔记

    SpringCache 一 简介 1 缓存介绍 Spring 从 3 1 开始就引入了对 Cache 的支持 定义了 org springframework cache Cache 和 org springframework cache C
  • Python中float类型、float32类型和float64类型的表示精度,所需内存及其之间的转换

    1 表示精度和所需内存 float类型和float64类型是一样的 都需要64个bits 而float32需要32个bits 精度方面 float类型和float64类型在十进制中可以有16位 而float32类型在十进制中有8位 如下 g
  • 哔哩哔哩 API

    常用查看技巧 UP主所有视频 https www bilibili com medialist play 这里写uid from space 最新投稿的视频 https www bilibili com newlist html API 参
  • 完美解决Missing artifact com.oracle:ojdbc6:jar:11.2.0.4

    今天运行Tomcat项目时 在加载maven依赖的时候报了Missing artifact com oracle ojdbc6 jar 11 2 0 4的错 意思是说我缺少了com oracle ojdbc6 jar 11 2 0 4的依赖
  • 基于axios的二次封装

    1 axios的封装前言 axios是一个基于 promise 的 HTTP 库 目前 在vue react框架中也还是备受青睐 根据不同项目的业务 也有许多种不同的封装方法 但不同的应用场景 导致封装的代码风格不一 我这里想总结下封装的思
  • IDEA项目及字体样式和初始化等习惯配置

    前言 内容较多 按需检索 0 IDEA常用快捷键 1 主题设置 黑白 2 字体大小设置 3 全局编码 字符集改为utf 8 3 1 文件编码设置 3 2 新建项目字符集设置 3 3 单个文件编码设置 idea面板右下角 4 Maven配置

随机推荐

  • 如何设置环境变量

    首先强烈推荐一款免费的c 的IDE code block 免费的且自带了MinGW编译器 自己可以设置字体及大小 一般设置成12号比较合适 直接在界面上的Setting gt Editor 在右上角上有一个choose 然后就可以选择字体
  • 书城管理系统(前端)

    OK 兄弟们 测试上传图片的后端接口 测试分页条件查询后端接口 测试根据id查询后端接口 测试新增一本书的后端接口 测试修改一本书的后端接口 之前写好的后端接口 用postman测试一下 没有问题的话我们就试试开发前端 准备工作 用vue创
  • MYSQL 时间处理

    1 MySQL 获得当前时间戳函数 current timestamp current timestamp mysql gt select current timestamp current timestamp current timest
  • BERT使用过程中的碰到的那些报错

    BERT是谷歌2018年提出的语言模型 在十几个任务上达到了state of art 在这里本人在使用过程中总结了一下遇到的错误 BERT推荐在TPU上运行 但是资源有限在GPU上跑也行 不行也能在cpu上跑 ps就是有些慢 官方BERT的
  • RPA机器人成为金融银行业转型的重要推手

    当前 金融科技迅猛发展 金融业监管和合规要求不断提升 为了应对挑战 抓住机遇 银行业作为国民经济体系重要的组成部分和核心产业 早已开始探索科技赋能金融之路 当前银行业面临的难题 成熟的银行都会在其内部部署多个业务平台 管理系统 以实现业务流
  • arduino控制步进电机

    一 实物连接 二 代码实现 const int IN1 11 const int IN2 10 const int IN3 9 const int IN4 8 正转顺序 const char tab1 0x01 0x03 0x02 0x06
  • 【spring源码探索】一分钟搞懂RefreshScope的作用及实现原理

    前文 下述文章完全为个人阅读源码的随笔记录 如有错误 欢迎大家指出 过程 过程很坎坷 而且大家应该都不想看了吧 简而言之就是先写个测试DEMO 然后各种DEBUG 结论 这次先直接上结论 然后再通过测试DEMO给出验证 最后再去跟代码 Re
  • 怎样在Android访问php取回json数据

    1 代码 php代码 1 array array 2 username gt 杨铸 3 password gt 123456 4 user id gt 1 5 6 echojson encode array 2 代码 java代码 01 p
  • C语言算平均数,让用户输入一系列的正整数,输入-1表示输入结束,算出这些数字的平均数

    include
  • JAVA怎么替换html标签呢???

    之前遇见个需求 让我在下载文件时 把content里面的富文本存储的内容下载下来 但是又不能有html标签 那个我们怎们处理呢 废话不多说 上代码 StringBuffer stringBuffer new StringBuffer Str
  • Android10.0 Binder通信原理(七)-Framework binder示例

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • 幸有一事,生死可许

    已然到了岁末 2014就要结束 迎来崭新的2015 颇多感慨 颇多难忘 与其说是2014年是我职业生涯中至关重要的一年 倒不如说是我人生道路上极为重要的一步来的更为贴切 这一年忙忙碌碌 一刻不得清闲 却是极为充实 没有迷茫 没有挣扎 有的只
  • httpclient发送Get请求和Post请求

    创建HttpClient发送请求 接收响应 Get请求简介 get无参数 get有参数 Post请求简介 post携带JSON参数 post携带表单参数 postman自动生成OKhttp代码 Get请求简介 1 创建HttpClient对
  • 华为交换机日常用巡检命令

    display version 查看设备允许版本 display startup 检查软件包 display licence 检查Licence信息 display patch information 检查补丁信息 display cloc
  • nrm安装后报错的解决办法(windows环境)

    安装 nrm npm install g nrm 运行nrm ls报错 配置系统环境变量 查询npm所在的路径 执行以下命令 其中prefix就是所需路径 npm config ls 新建系统环境变量 变量名 自己可定 只要与下一步添加时一
  • git解决冲突方法

    多人协作代码 若修改区域不是同一块很容易解决 场景描述 初始master上代码版本号为A 他人在本地修改后提交到master 版本号变为B 但此时我本地版本号仍是A 本地修改之后变为B 无法进行推送 解决方案 1 查看并创建分支 git b
  • Scala如何使用元组?用法代码实例

    Tuple是元素的集合 元组是异构的数据结构 也就是说 它们可以存储不同数据类型的元素 元组是不可变的 不像scala中的数组是可变的 存储整数 字符串和布尔值的元组的示例 val name 15 Chandan true 元组的类型由其所
  • pytorch函数详解

    pytorch函数详解 在typora这里写之后复制到简书上 1 torchvision 1 1 transforms Compose transforms 把几个转换组合 example from PIL import Image t t
  • k-均值(k-means)及Matlab动态实现

    k 均值 k means 及Matlab实现 注 1 仅适合于数值属性的数据 2 对正态分布 高斯分布 数据聚类效果最佳 1 算法思想 k means算法 也称k 均值算法 它把N个对象划分成k个簇 用簇中对象的均值表示每个簇的中心点 质心
  • 红黑树与平衡二叉树_奈学:红黑树(RedBlackTree)的概述

    1 AVL树与红黑树 AVL树是一种自平衡的二叉查找树 又称平衡二叉树 AVL用平衡因子判断是否平衡并通过旋转来实现平衡 它的平衡的要求是 所有节点的左右子树高度差不超过1 AVL树是一种高平衡度的二叉树 执行插入或者删除操作之后 只要不满