概念解析:

  红黑树是一种自平衡二叉查找树(self-balancing binary search tree)。因此,红黑树本身就是二叉树的一个变种。典型的用途是实现关联数组(Associative Array),也就是map<key,value>。

红黑树五点约束条件:(FROM 百度 & wikipedia)

性质1. 节点是红色或黑色;(A node is either red or black;)
性质2. 根节点是黑色;(The root is black;)
性质3 每个叶节点(NULL节点,空节点)是黑色的。(All leaves (NULL) are black;)
性质4 每个红色节点的两个子节点都是黑色;(Every red node must have two black child nodes;)
性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。(Every path from a given node to any of its descendant leaves contain the same number of black nodes.)

  Note:上述五个性质的定义来自于百度 & wikipedia。个人认为这个五个性质定义得不是很通俗易懂。既然是红黑树,则性质1是自然而然的了。再者,性质2和性质3可以合并起来一起记忆。因此,可以改为以下三个性质定义:

  1.根节点和叶子节点都是黑色,其中叶子节点为NULL节点;

  2.任意父子两个节点不能同时为红色;

  3.从根节点到所有叶子节点的路径上的黑色节点的个数是相同的。

  此外,需要记住的是红黑树本身就是二叉树的一个变种。

红黑树的性能:

  AVL树因为是高平衡的,所以其查找的性能是O(logn)。但是,AVL树的插入和删除两个操作可能需要通过一次或多次树旋转来重新平衡这个树。因此,如何在插入和删除比较频繁的应用环境下,AVL树需要比较大消耗。而RB树则是既能保证查找性能的同时,也能使用相对“便宜”的操作来实现插入和删除操作。这在于RB树并不追求“高平衡”--它仅仅要求部分平衡,降低了对树旋转的要求。

  其实上述的五个约束性质是强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。证明:很容易得到RB树种最短的路径是节点全是黑色的路径,而最长的路径可能是刚刚好黑色和红色相间的路径,此时后者刚刚好是前者的两倍。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。【FROM 百度】

  在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。

  此外,红黑树也并不是适合于所有应用树的领域。例如:如果数据在初始化后不会有插入和删除(或者很少的插入和删除),即数据基本不变动的情况下,使用hash table结构,查找性能则更适合。

红黑树的实现:

  红黑树节点的定义如下:

 1 typedef enum Color {
 2     RED, BLACK
 3 } Color;
 4
 5 typedef struct RB_node {
 6     Color _color;
 7     int _key;
 8     struct RB_node *_left_child;
 9     struct RB_node *_right_child;
10     struct RB_node *_parent;
11 }*RB_node_ptr, RB_node;

<待续...>

转载于:https://www.cnblogs.com/lhmily/p/3692985.html

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

  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,RBT)

    1.红黑树 强烈推荐!!算法交互式网站: Red/Black Tree 在insert左侧框输入要插入的数字,然后点击insert就会按红黑树规则进行插入 1.1 什么是红黑树? 红黑树是一种平衡二叉 ...

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

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

  10. 红黑树 Reb Black Tree

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

最新文章

  1. 微博 php7,新浪微博PHP版SDK的导致20007错误
  2. 【笔记】基于轻量和积网络及无人机遥感图像的大豆田杂草识别
  3. asp.net 页面static变量问题
  4. JAVA实现可设置背景的MDI窗口
  5. 如何在vue中使用图形验证码
  6. 前端学习(3289):react hook state-hook
  7. ISDN与PSTN的区别是什么?
  8. 常用数据结构--线性结构
  9. ASP.NET MVC4实现TinyMCE 4.0.20自定义上传功能
  10. 让你受用一辈子的一条CMD命令
  11. 循环队列的创建Java_Java版-数据结构-队列(循环队列)
  12. EPS绘图常用快捷键及复杂台阶的画法
  13. encountered an improper argument解决方案
  14. c:\windows\ ntdetect failed
  15. Machine Learning Regression-Case Study
  16. Lesson 18 Kaggle医学影像识别 PART 1
  17. Python迭代器和生成器详解(包括yield详解)
  18. 网络存储技术Windows server 2012(项目三 存储池的配置与管理)
  19. WiFi基本概念(八)(信道估计 L-STF,L-LTF,Pilots)
  20. 模电知识体系总结-1.1半导体基础器件

热门文章

  1. SpringBoot使用AOP,PointCut表达式详解以及使用
  2. Spring Boot 之异步执行方法
  3. 用计算机画出方格表,方格造型图_怎么做这种颜色相间的方格图(有图)_彩妆阁...
  4. 纠错帖:Zuul Spring Cloud Gateway Linkerd性能对比
  5. 软件开发中团队能力的培养
  6. vue和iview应用中的一些问题(持续更新)
  7. Vagrant+PHPStorm+Google+XDebug断点调试
  8. git 提交代码的步骤
  9. 自学java 第十章内部类(一)
  10. url 编码 js url传参中文乱码解决方案