1.红黑树

强烈推荐!!算法交互式网站: Red/Black Tree
在insert左侧框输入要插入的数字,然后点击insert就会按红黑树规则进行插入

1.1 什么是红黑树?

红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但对之进行平衡的代价较低, 其平均统计性能要强于 AVL 【引用自红黑树】

笔记来源于:什么是红黑树,据说红黑树很难理解,看动画5分钟就弄明白原理

1.2 为什么要引入红黑树?

二叉排序树(BST)、平衡二叉树(AVL)、红黑树(RBT)均用于查找数据元素

平衡二叉树(AVL)为严格平衡的(左子树高度 - 右子树高度 ≤\leq≤ 1)
红黑树(RBT)为非严格平衡(红黑树中从根到叶结点的最长路径 ≤\leq≤ 最短路径的2倍,即左右子树高度最多差2倍)

BST →\rightarrow→ AVL →\rightarrow→ RBT
从 BST 到 AVL 引入平衡,将二叉排序树的树高缩小,提高了查找效率
从 AVL 到 RBT 引入颜色,解决插入/删除频繁调整AVL的问题

这三个树对应三个操作的时间复杂度如下表【此表引自王道考研计算机数据结构全程班】

由上表看出平衡二叉树和红黑树的三个操作时间复杂度完全一样,但我们为什么要引入红黑树?
原因在于:平衡二叉树中当插入/删除一个元素时,我们要判断是否在插入/删除元素后,平衡二叉树不再平衡,即平衡因子不满足要求(左子树高度−-−右子树高度=−1/1/0=-1/1/0=−1/1/0),如果不满足平衡要求,我们需要对不平衡的二叉树进行调整,这个调整的过程时间开销很大。尤其在插入多个元素时,要频繁的调整树的状态。由此引出红黑树,红黑树在插入/删除后,不会破坏“红黑”特性,无需频繁调整树的状态。即便需要调整,其时间消耗也在常数级别

平衡二叉树的适用情况:以查为主,很少进行插入或删除
红黑树的适用情况:频繁进行插入或删除

1.3 红黑树的性质

笔记来源于:什么是红黑树,据说红黑树很难理解,看动画5分钟就弄明白原理

红黑树(RBT)首先是一颗二叉排序树(BST),即满足 左子树结点值 <\lt< 根结点的值 <\lt< 右子树结点值

性质一:根结点是黑色的、叶结点是不存储数据的黑色空结点
注意:这里的叶结点是方形(查找失败的结点),注意与其他树的叶结点进行区别!!

性质二:任何相邻的两个结点不能同时为红色
即红结点的父结点和孩子结点均为黑色
注意:这种相邻是路径上的相邻,兄弟不属于相邻!!


性质三:任意结点到其可到达的叶结点各条路径上经过相同数量的黑色结点
例如:下图结点a到左子树叶结点之间包含2个黑色结点,结点a到右子树叶结点之间也包含2个黑色结点

当从根到任一叶结点的简单路径最短时,这条路径必然全由黑结点构成

黑高:从某结点出发(不含该结点)到达叶结点的任一简单路径上黑结点总数称为该结点的黑高(记为bh)

1.4 红黑树的结论

结论1:红黑树中从根到叶结点的最长路径 ≤\leq≤ 最短路径的2倍
例如:下图一条路径长度为3,另一条路径长度为2,3<2×2=43 \lt 2×2=43<2×2=4

结论2:有n个内部结点(圆结点)的红黑树的高度 h≤2log⁡2(n+1)h \leq 2\log_2(n+1)h≤2log2​(n+1)

结论2证明:从根结点到叶结点(不含叶结点)的任何一条简单路径上都至少有一半是黑结点,所以根的黑高至少为 h/2h/2h/2,于是有 n≥2h/2−1n \geq 2^{h/2}-1n≥2h/2−1 (树的结点总个数)
n≥2h/2−1n+1≥2h/2log⁡2(n+1)≥h2h≤2log⁡2(n+1)n \geq 2^{h/2}-1\\ ~\\ n+1 \geq 2^{h/2}\\ ~\\ \log_2(n+1) \geq \frac{h}{2}\\ ~\\ h \leq 2\log_2(n+1) n≥2h/2−1 n+1≥2h/2 log2​(n+1)≥2h​ h≤2log2​(n+1)


左侧红黑树的高度为h=5h=5h=5 去除红结点后的树高为 h=2h=2h=2(不含叶结点)即 5/2=25/2=25/2=2

根结点黑高为 h 的红黑树,内部结点(圆结点)至少有多少个?
内部结点最少的情况:总共 h 层黑结点的满树状态
若根结点黑高为 h 的红黑树,内部结点(圆结点)至少有 2h−12^h-12h−1 个


1.5 红黑树的查找

RBT的查找与 BST、AVL的查找相同,从根出发,左小右大,若查找到空叶结点,则查找失败

1.6 红黑树的插入

以下笔记来自王道考研计算机数据结构全程班

回顾红黑树定义:
左根右:红黑树的二叉排序树满足:左结点的值 <\lt< 根结点的值 <\lt< 右结点的值
根叶黑:根结点和叶子结点为黑色
不红红:任何相邻的两个结点不能同时为红色
黑路同:任意结点到其可到达的叶结点各条路径上经过相同数量的黑色结点

红黑树插入结点过程


以一个例子介绍红黑树插入结点后的调整过程
例子:
从一颗空的红黑树开始,插入:20、10、5、30、40、57、3、2、4、35、25、18、22、23、1、24、19、18

插入结点20、10、5

插入结点30

插入结点40

插入结点57

插入结点3

插入结点2

插入结点4

插入结点35

插入结点25

插入结点18

插入结点22

插入结点23

插入结点24

插入结点18

红黑树(Red-Black Tree,RBT)相关推荐

  1. 红黑树Red/Black Tree

    红黑树Red/Black Tree 建立二进制搜索树,我们得到红/黑树,旨在解决BST可能变得不平衡的问题.(BST[二叉搜索树],是对于任意的node x,如果node y是node x的左边的节点 ...

  2. 数据结构--红黑树 Red Black Tree

    文章目录 1.概念 2.操作 2.1 左旋.右旋(围绕某个节点的左/右旋) 2.2 插入 2.3 删除 3. 代码 1.概念 二叉树在频繁动态增删后,可能退化成链表,时间复杂度由 O(lgn) 变成 ...

  3. 红黑树(Red Black Tree)详解

    红黑树 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组. 红黑树是在1972年由Rudolf Bayer发明的,当时被称为 ...

  4. 红黑树(Red Black Tree)超详细解析

    红黑树详解 什么是红黑树? ​ 红黑树,是一种二叉搜索树的特化,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black. 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确 ...

  5. 红黑树(Red–black tree)

    一.红黑树的概念: 在计算机科学中,红黑树是一种自平衡二叉搜索树.每个节点存储一个表示"颜色"("红"或"黑")的额外位,用于确保树在插入和 ...

  6. 数据结构——红黑树(red-black tree)

    RB-tree(红黑树)是一种平衡二叉搜索树,它每个节点上增加了一个存储位来表示节点的颜色,可以是 Red 或 Black,故得名.通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,红黑树能 ...

  7. 红黑树(Red-Black Tree)解析

    这一篇我们来聊聊红黑树,写这篇文章的起因是在阅读HashMap源码时,发现JDK1.8对于HashMap的实现引入了红黑树来处理哈希冲突以提高性能(戳这里,有详述),而红黑树的数据结构和操作都是较为复 ...

  8. 高级数据结构与算法 | 红黑树(Red-Black Tree)

    文章目录 红黑树 红黑树的概念 红黑树的性质 红黑树与AVL树 红黑树的实现 红黑树的节点 红黑树的插入 红黑树的查找 红黑树的验证 完整代码 红黑树 红黑树的概念 红黑树,是一种二叉搜索树,但在每个 ...

  9. 红黑树 Reb Black Tree

    前言 在AVL中提到了,当插入和删除频率较高时,我们选择红黑树来降低因不断的维护平衡带来的时间损耗.在诸多地方(比如JDK1.8的HashMap--)得到了广泛的应用.那么,什么是红黑树,为什么就这么 ...

最新文章

  1. Github上AI在银行和保险的应用列表
  2. Linux-gate.so.1的含义[ZZ]
  3. 云服务器(uCloud)部署java web项目(二) 安装,配置apache服务器
  4. 如何构建一个拖垮整个公司的备份系统
  5. ORACLE日期时间函数大全(一)
  6. quick: setup_mac.sh分析
  7. 面试笔记【自己总结】
  8. map+shuffle+reducer
  9. 在Windows上将Ctrl+C信号发送到Python subprocess子进程
  10. Unity3d打包程序报错NotSupportedException: Encoding 437 data could not be found.
  11. 组建团队和调整团队结构
  12. IB中文诗歌手法分析
  13. Nginx实现会话保持
  14. jqwidgets技术分享
  15. Android 之 APP上架应用宝平台
  16. vue v-for遍历动态展示元素数量
  17. 使用c++模拟红白机——概论篇(一)
  18. python 切片详解
  19. 【招聘推荐】启元世界招聘深度强化学习算法工程师
  20. 卧听夏蝉---傲娇的xmlhttp.responseText和JSON传值问题

热门文章

  1. Vue.js父与子组件之间传参 父向子组件传参   例子:App.vue为父,引入componetA组件之后,则可以在template中使用标签(注意驼峰写法要改成componet-a写法,因为ht
  2. 订单系统设计 —— 订单管理
  3. matlab自带的mri数据集,探查三维 MRI 数据集的切片
  4. 蓝屏代码大全(留着自己看)
  5. Introduce Parameter Object (引入参数对象)
  6. 服装电商APP软件开发平台作用
  7. 整理的一些关于手机拍照技巧的内容
  8. 苹果手机计算机无法横屏,苹果手机怎么设置屏幕旋转失灵了怎么办
  9. Android编译中m、mm、mmm的区别
  10. 【例题】【高斯消元】USACO3.2.4 Feed Ratios