红黑树

红黑树(Red–black tree)是一种自平衡二叉查找树。红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。

红黑树的特性:
1.节点要么是红色要么就是黑色,不能没有颜色。
2.根节点是黑色的。
3.所有叶子节点都是黑色的。
4.每个红色节点必须有两个黑色的子节点。
5.从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

从根节点到叶子节点的最长路径不会超过最短路径的 2 倍,所以它对查找、删除和新增的最差时间复杂度为 O(log n),且叶子上没有数据存储。

红黑树的实现

在 AVL树 插入中,插入后导致不平衡,我们使用旋转来保证它的平衡性。在红黑树中,我们使用 重新着色旋转 来进行平衡。 首先,我们尝试重新着色,如果重新着色满足不了红黑树的特性,那么我们就进行旋转。

插入算法主要有两种情况,取决于叔叔节点的颜色。如果叔叔节点是红色的,就进行重新着色。如果叔叔节点是黑色的,就要进行旋转和(或)重新着色操作。

左旋和右旋请先参考《数据结构之「AVL树」》。

新添加的节点设置为红色。如果设为黑色,就会导致根到叶子节点的路径上有一条路上,多一个额外的黑节点,这个是很难调整的。但是设为红色节点后,可能会导致出现两个连续红色节点的冲突,那么可以通过重新着色和树旋转来调整。

假如新插入的节点为 x:
1.按标准的二叉搜索树插入节点颜色为红色的新节点。

2.假如 x 就是根节点,那么改变 x 节点颜色为黑色。

3.如果新节点的父节点是黑色的,直接返回。

4.如果父节点和叔叔节点都是红色的,需要改变父节点和叔叔节点的颜色为黑色,并设置祖父节点为红色,如果祖父节点为根节点,设置祖父节点颜色为黑色。

5.如果父节点是红色而叔叔节点是黑色或缺少,新节点是父节点的左子节点,而父节点又是其父节点的左子节点。这种情况就需要对祖父节点进行一次右旋,然后在切换父节点和祖父节点的颜色,就满足红黑树的性质了。

6.如果父节点是红色,而叔叔节点是黑色或缺少,并且新节点是其父节点的右子节点而父节点又是其父节点的左子节点。需要先对当前节点节点进行左旋,变成 情形5,然后按 情形5 的步骤操作来。

总结

与 AVL树 相比,AVL树 更加平衡,但它可能在插入和删除期间引 起更多旋转。因此,如果频繁的插入和删除操作,那么应该首选红黑树。如果插入和删除频率较低且搜索是更频繁的操作,那么AVL树应优先于红黑树。

红黑树牺牲了部分平衡性以换取插入/删除操作时做少量的旋转操作,整体来说性能要优于AVL树。

在 JDK 中,都是用红黑树来做 TreeSet 和 TreeMap 的数据结构存储,在 JDK1.8之后都是用红黑树来存储哈希冲突大于等于八个节点的数据结构,所以红黑树还是一种比较常用的数据结构。

PS:
清山绿水始于尘,博学多识贵于勤。
我有酒,你有故事吗?
公众号:「清尘闲聊」。
欢迎一起谈天说地,聊代码。

数据结构之「红黑树」相关推荐

  1. 数据结构 - 学习笔记 - 红黑树

    数据结构 - 学习笔记 - 红黑树 定义 简介 知识点 1. 结点属性 2. 前驱.后继 3. 旋转 查找 插入 父结点为黑色 父结点为红色 1. 有4种情形只需要变色(对应234树4结点) 1.1. ...

  2. 数据结构与算法 / 红黑树

    一.定义 根节点是黑色的. 叶子节点是空的且是黑色的. 任何相邻的节点不能都为红色. 任意节点到其每个叶子节点的路径上,黑色的节点的数量相同. 二.性质 红黑树解决了 AVL 树增.删时耗时过大的问题 ...

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

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

  4. 父子结构查询_Java面试准备(5)之数据结构与算法——红黑树

    欢迎点赞评论+关注~~~~~~~ 如上图,二叉查找树极端情况下可能会变成一个单链表,这种查询时间复杂度就变成O(n)了,红黑树在二叉查找树的基础上进行了自平衡. 1.原理分析 如上图,红黑树具有以下特 ...

  5. 数据结构拾遗(1) --红黑树的设计与实现(上)

    红黑树是一种自平衡的二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组(C++ STL 中的map/set).它是在1972年由Rudolf Bayer发明的,他称之为" ...

  6. MySQL索引数据结构二叉树、红黑树、B-Tree、B+Tree、Hash

    索引:帮助MySQL高效获取数据的有序的数据结构. 假设我们有一张表table,包含Clo1和Clo2两个字段 内存地址 Clo1 Clo2 0x07 1 36 0x5A 2 20 0x7A 3 80 ...

  7. 数据结构拾遗(3) --红黑树的设计与实现(下)

    完整源代码: http://download.csdn.net/detail/hanqing280441589/8450041 红黑节点设计与实现 template <typename Comp ...

  8. 数据结构拾遗(2) --红黑树的设计与实现(中)

    Insert完善 根据规则4, 新增节点必须为红; 根据规则3, 新增节点之父节点必须为黑. 示例: (1)插入16(红色)/55(红色), 则既不用旋转, 也不用重新染色 (2)插入82(红色),  ...

  9. php 字典树实现,数据结构之「字典树」

    字典树 字典树,又称 前缀树 或 trie树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前 ...

最新文章

  1. 中国首个AI考级来了:共分10级,北大出题,工信部认证 | 在线可测,我最多活3级...
  2. Sql 将多个表查询的结果进行再次查询
  3. C语言 使用指针对两个变量的数值进行互换
  4. vue 怎么样不重复往数组里插入数据_Vue.js在数组中插入重复数据的实现代码分享...
  5. 1.16 static关键字(静态变量和静态方法)
  6. Vue 中的 v-cloak 作用及用法-vue页面加载时会闪烁
  7. android 访问https服务器
  8. 十八种方法让你集中精力工作
  9. android o x86,ubuntu-android--make: *** [out/host/linux-x86/o...
  10. 16.6 假新闻识别 Fake News Detection on Social Media A Data Mining Perspective
  11. css-a:visited
  12. 【论文视频】对比学习论文综述【论文精读】
  13. js-鼠标经过显示下拉菜单
  14. 色 彩 RGB 值 对 照 表
  15. 木子网罗数据库笔试题(一)
  16. 桌面应用之electron开发
  17. 请相信一个绝地反击的故事
  18. VMware配置虚拟机映射,实现局域网络互相访问
  19. 玩转Kubernetes—尝试以不同方式初始化集群
  20. Ubuntu中运行AppImage文件的方法

热门文章

  1. C - Marbles Gym - 102348C
  2. Java课程设计-学籍信息管理系统
  3. PKU ACM/ICPC竞赛队最近八年比赛成绩
  4. 爬取贝壳平台新房数据并可视化
  5. 透视前端工程化之一:模板功能设计
  6. 阿里云服务器数据盘是什么?系统盘和数据盘区别
  7. 任务栏的快捷图标变成白色文本
  8. 从社会契约论的角度看区块链开发的属性
  9. python 爬虫之URLlib的编码和解码
  10. php 重定向不刷新页面,PHP重定向如何实现数据不丢失