概念解析:

  红黑树是一种自平衡二叉查找树(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结构,查找性能则更适合。

红黑树的实现:

  红黑树节点的定义如下:

 typedef enum Color {
RED, BLACK
} Color; typedef struct RB_node {
Color _color;
int _key;
struct RB_node *_left_child;
struct RB_node *_right_child;
struct RB_node *_parent;
}*RB_node_ptr, RB_node;

<待续...>

最新文章

  1. [.net 面向对象程序设计进阶] (5) Lamda表达式(一) 创建委托
  2. JavaScript Boolean 对象
  3. Monkey测试的策略和分析
  4. sitecustomize.py 用法
  5. MapReduce程序开发之流量求和(八)
  6. web本地存储-IndexedDB
  7. Mybatis第一篇【介绍、快速入门、工作流程】
  8. UISearchBar的扩展使用
  9. C#winform自定义控件模拟设计时界面鼠标移动和调节大小、选中效果
  10. 获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄
  11. Struts2实现文件上传(三)
  12. jdk源码阅读笔记-HashSet
  13. [Swift]LeetCode993. 二叉树的堂兄弟节点 | Cousins in Binary Tree
  14. 《java与模式》
  15. 【原创】大叔问题定位分享(23)Ambari安装向导点击下一步卡住
  16. linux 解决乱码问题
  17. .net webservice的get支持,
  18. CSS--margin塌陷
  19. JavaScript 中this的实现原理
  20. 【转】Java学习---Java中volatile关键字实现原理

热门文章

  1. opencv:图像的腐蚀和膨胀
  2. 循环神经网络RNN模型和长短时记忆系统LSTM
  3. node.js之npm库
  4. (二)js选择结构
  5. [转]MFC 调用 printf 输出
  6. SQLServer流水号自动生成
  7. NOI 2018 你的名字
  8. Scrapy框架及组件描述
  9. ASP.NET 线程详解
  10. 剑指offer-第六章面试中的各项能力(扑克牌中的顺子)