红黑树

一、简介

红黑树(Red Black Tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。

红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉树的平衡,从而获得较高的查找性能。

它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

二、红黑树的特征

  • 节点都有颜色( 在红-黑树中,每个节点的颜色或者是黑色或者是红色的。当然也可以是任意别的两种颜色,这里的颜色用于标记,我们可以在节点类Node中增加一个boolean型变量isRed,以此来表示颜色的信息 )
  • 在插入和删除的过程中,要遵循保持这些颜色的不同排列规则,在插入或者删除一个节点时,必须要遵守的规则称为红-黑规则 :
    • 每个节点不是红色就是黑色
    • 根节点总是黑色
    • 如果节点是红色,那他的子节点必须是黑色的(反之不一定, 也就是从每个叶子到根的所有路径上不能有两个连续的红色节点)
    • 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色亮度)

三、红黑树的自我调整:

  • 颜色调整

  • 结构调整:

    ①左旋(Rotate Left):如下图,左旋的过程是将右子树饶x逆时针旋转,使得x的右子树成为x的父亲,同时修改相关节点的引用。旋转之后,红黑树的基本属性仍然满足。


②右旋(Rotate Left):如下图,右旋的过程是将x的左子树绕x顺时针旋转,使得x的左子树成为x的父亲,同时修改相关节点的引用。旋转之后,二叉查找树的属性仍然满足。

四、红黑树代码实现:

  • github地址: 红黑树算法实现

红黑树算法原理及实现相关推荐

  1. 红黑树算法原理(从二叉搜索树讲起)

    原文:红黑树深入剖析及Java实现,本文修改了原文的一些小错误,如果想看红黑树的Java实现可以到原文去看. 红黑树是平衡二叉查找树的一种.为了深入理解红黑树,我们需要从二叉查找树开始讲起. BST ...

  2. linux算法设计,红黑树的原理分析和算法设计

    红黑树是60年代中期计算机科学界找寻一种算法复杂度稳定,容易实现的数据存储算法的产物.在优先级队列.字典等实用领域都有广泛地应用,更是70年代提出的关系数据库模型--B树的鼻祖.在Linux kern ...

  3. 左倾红黑树的原理及简单实现

    (注:以下图片全部源于<算法 第4版>) 左倾红黑树的原理及简单实现 左倾红黑树的简介 左倾红黑树的定义 左倾红黑树与2-3树的对比 左倾红黑树的颜色表示 左倾红黑树的一些基本操作 1.颜 ...

  4. 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现--转

    TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常 ...

  5. python:实现红黑树算法(附完整源码)

    python:实现红黑树算法 from __future__ import annotations from collections.abc import Iterator class RedBlac ...

  6. 红黑树结构原理的图文讲解(非代码)

    1.引言 HashMap的基本结构是数组,链表和红黑树.以数组为基本形态,数组中的元素先以链表形式储存,当链表的长度超过8时(包含数组上的那个链表头)就会将链表转换为红黑树,以加快修改和查询效率.当然 ...

  7. 红黑树 之 原理和算法详细介绍

    概要 目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树的基本操作(一) 左旋和右旋 5 红黑树的基本操作(二) 添加 6 红黑树的基本操作(三) 删除 作者:Sk ...

  8. 红黑树的原理_红黑树插入算法实现原理分析

    ­ 引言 红黑树是在实际工程中被广泛应用的一种数据结构,比如Linux中的线程调度就是使用的红黑树来管理进程控制块,而Nginx中也是使用红黑树来管理的timer,Java中的TreeMap和Tree ...

  9. 红黑树动画+红黑树算法详细介绍

    说起红黑树,先给一个js的实现.可以动画看效果 https://www.cs.usfca.edu/~galles/visualization/RedBlack.html 然后算法问题,我再描述一遍也没 ...

最新文章

  1. Class,表名,表单参数名关系
  2. Mosaic获5.5亿美元住宅太阳能融资贷款
  3. labview连接mysql数据库_labview使用DSN与数据库的连接包括access,mysql
  4. 深度学习之生成式对抗网络 GAN(Generative Adversarial Networks)
  5. PCA对特征点描述子降维
  6. Sentinel如何通过限流实现服务的高可用性
  7. Python demjson 下载并安装
  8. zoj 3629 Treasure Hunt IV
  9. 【白皮书分享】2021中国数字经济时代人工智能生态白皮书.pdf(附下载链接)...
  10. 电子设计比赛的STM32知识准备
  11. Installation of Ubuntu source-insight
  12. RedissonMultiLock + RedissonLock部分源码
  13. 谢菲尔德遗传算法工具箱
  14. golang java 对比_golang编程语言和java的性能对比
  15. C语言房地产销售管理系统,房地产销售管理系统的设计与实现
  16. 遗传算法框架deap简介与使用
  17. iOS耳机红外线遥控器
  18. Linux中etc目录etc是什么单词的缩写
  19. java实现加减乘除_用Java编写实现加减乘除,界面如下
  20. WebRTC源码研究(47)WebRCT传输非音视频数据

热门文章

  1. android 解析新浪微博json数据
  2. 史上最全青龙面板2.9/2.10++Ninja从零安装教程+基本命令及仓库全套
  3. USACO 2020Jan Platinum 题解
  4. 小程序之相对定位与绝对定位
  5. MYSQL时间戳函数
  6. HTTP又被弃!微信公众号API仅支持HTTPS调用
  7. springboot配置aop切面详解
  8. JavaScript 中获取当前日期
  9. EA大作安卓游戏:《死亡空间》攻略
  10. Vue3电影中后台开发纪实(六):权限管理