红黑树

一、简介

红黑树(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. html css盒子顶层,HTML学习之四CSS盒子
  2. .Net Core 3.1,这匹黑马,2020年值得所有程序员重视!
  3. php 编写线程教程,php 实现多线程
  4. mysql sysdate 格式化_MySQL函数汇总
  5. 为什么单击用户账户没有反应_win10用户获取最高权限的方法
  6. mybatis批量删除提示类型错误
  7. hibernate使用sql语句查询实体时,要写上addEntity
  8. 更换Homebrew的更新源
  9. jQuery - 选择器(五)
  10. wamp下安装php的xdebug调试的方法
  11. 【心电信号】基于matlab心电信号特征提取+分析处理【含Matlab源码 289期】
  12. WPS 关闭热点推送通知
  13. Gartner发布《2021年RPA魔力象限》,两家中国企业首次入选,开创历史!
  14. U盘插入后只显示安全删除硬件问题
  15. java 数字翻译成英文_【Java】 剑指offer(46) 把数字翻译成字符串
  16. 为效率而生-开源Mac版Google Authenticator认证客户端GoldenPasspor
  17. 集团公司预算控制与网上费用报销系统
  18. 【Spring】JdbcTemplate常用方法使用示例
  19. 数字逻辑 课程设计 多功能电子钟 Quartus II
  20. centos8 免密登录

热门文章

  1. 77. 查看线程的运行状态
  2. HTML中图片环绕方式
  3. 2022,Cerebro(码小二)V3.0来啦!
  4. java oracle查询结果list取数,Oracle函数返回Table集合
  5. 恶魔法则 没耐性看下去了,给跳舞的
  6. 中国广电出招了,5G套餐低至11元,三大运营商彻底慌了
  7. Docker基础镜像-从iso到image
  8. 免费学习《华为云入门》,智能音响,体脂秤,荣耀手环等你拿
  9. 国产完全替换AM26LS31、AM26C31、AM26LV31
  10. git切换分支及关联远程仓git常用命令。