概念解析:

  红黑树是一种自平衡二叉查找树(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;

<待续...>

红黑树(Red-Black Tree)的更多相关文章

  1. 笔试算法题(51):简介 - 红黑树(RedBlack Tree)

    红黑树(Red-Black Tree) 红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B):通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的 ...

  2. C# 链表 二叉树 平衡二叉树 红黑树 B-Tree B+Tree 索引实现

    链表=>二叉树=>平衡二叉树=>红黑树=>B-Tree=>B+Tree 1.链表 链表结构是由许多节点构成的,每个节点都包含两部分: 数据部分:保存该节点的实际数据. 地 ...

  3. 2-3 树/红黑树(red-black tree)

    2-3 tree 2-3树节点: null节点,null节点到根节点的距离都是相同的,所以2-3数是平衡树 2叉节点,有两个分树,节点中有一个元素,左树元素更小,右树元素节点更大 3叉节点,有三个子树 ...

  4. 红黑树(R-B Tree)

    R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). ...

  5. 树-红黑树(R-B Tree)

    红黑树概念 特殊的二叉查找树,每个节点上都有存储位表示节点的颜色是红(Red)或黑(Black).时间复杂度是O(lgn),效率高. 特性: (1)每个节点或者是黑色,或者是红色. (2)根节点是黑色 ...

  6. 红黑树(RB Tree)

    看到一篇很好的文章 文章来源:http://www.360doc.com/content/15/0730/00/14359545_488262776.shtml 红黑树是一种高效的索引树,多于用关联数 ...

  7. 红黑树(Red-Black tree)

    红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性.同时红黑树更是一颗自平衡的排序二叉树.我们知道一颗基本的二叉树他们都需要满足一个基本性质–即树中的任何节点的值大于它的左子节点,且小 ...

  8. java数据结构——红黑树(R-B Tree)

    红黑树相比平衡二叉树(AVL)是一种弱平衡树,且具有以下特性: 1.每个节点非红即黑; 2.根节点是黑的; 3.每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的; 4.如图所示,如果一个 ...

  9. 红黑树(red-black tree)实现记录

    https://github.com/xieqing/red-black-tree A Red-black Tree Implementation In C There are several cho ...

  10. 红黑树(二)之 C语言的实现

    概要 红黑树在日常的使用中比较常用,例如Java的TreeMap和TreeSet,C++的STL,以及Linux内核中都有用到.之前写过一篇文章专门介绍红黑树的理论知识,本文将给出红黑数的C语言的实现 ...

随机推荐

  1. POJ3275:Ranking the Cows(Bitset加速floyd求闭包传递)

    Each of Farmer John's N cows (1 ≤ N ≤ 1,000) produces milk at a different positive rate, and FJ woul ...

  2. python学习笔记(生成xml)

    想着给框架加些功能 首先想到的是生成测试报告 这里就涉及到了生成什么格式的文件 我这边就准备生成 xml 格式的文件 自己先学习了整理了下 代码如下: #!/usr/bin/env python # ...

  3. 负载均衡之DNS域名解析

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38017027 在上一篇文章(http://blog.csdn.net/cywosp/arti ...

  4. Java中使用Log的方法

    一.java自带log:java.util.logging.Logger使用三步曲 public class HelloLogWorld { private static String name = ...

  5. (CSharp)克隆控件事件

    // https://stackoverflow.com/questions/6055038/how-to-clone-control-event-handlers-at-run-time // &q ...

  6. 【转】安装OS X虚拟机错误vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1123

    新建一个虚拟机, 选择客户机操作系统为Apple MacOS X 10.10, 其余参数可以默认. 注意建好之后不要急着打开客户机, 因为直接打开你会发现新建的客户机将会无法启动. 仔细阅读Mac O ...

  7. 探索Javascript 异步编程

    在我们日常编码中,需要异步的场景很多,比如读取文件内容.获取远程数据.发送数据到服务端等.因为浏览器环境里Javascript是单线程的,所以异步编程在前端领域尤为重要. 异步的概念 所谓异步,是指当 ...

  8. 《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group

    agenda-group 规则的调用与执行是通过StatelessKieSession或KieSession来实现的,一般的顺序是创建一个StatelessKieSession或KieSession, ...

  9. EasyPlayer实现Android MediaMuxer录像MP4(支持G711/AAC/G726音频)

    本文转自EasyDarwin开源团队John的博客:http://blog.csdn.net/jyt0551/article/details/72787095 Android平台的MediaMuxer ...

  10. vim自动打开跳到上次的光标位置

    只需要vimrc里面加一个稍微复杂一点的autocmd就搞定了: if has("autocmd") au BufReadPost * && line(" ...