红黑树

红黑树(Red-Black Tree)是一种二叉查找树(Binary Search Tree),但作了改进,即在每个结点上增加一个存储位表示结点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的路径上各个结点的着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。

  红黑树的每个节点属性包含五个域:color、key、parent、lchild、rchild。红黑树除了具有二叉搜索树的所有性质之外,还具有以下性质:

  1. 每个结点或是红的,或是黑的。

  2. 根结点是黑的。

  3. 每个叶结点是黑的。

  4. 如果一个结点是红的,则它的两个孩子都是黑的。

  5. 对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

  以上这些规则可以保证整棵树的平衡,红黑树的高度和查找时间都为O(log N)。

  二叉查找树在最坏的情况下可能会变成一个链表(当所有节点按从小到大的顺序依次插入后)。而红黑树在每一次插入或删除节点之后都会花O(log N)的时间来对树的结构作修改,以保证红黑树的性质,从而保持树的平衡。因此,红黑树的查找方法与二叉查找树相同,而Insert和Delete结点的的方法前半部分与二叉查找树相同,而后半部分添加了一些修改树红黑树结构的操作。具体分析请参见“算法导论”一书第13章。下面给出一种红黑树的C实现,修改自Linux内核源码中的红黑树实现(rbtree.h, rbtree.c)。

rbtree.h

rbtree.c

demo.c

( Aiguille.LIU / 刘爱贵, [email protected])

参考文献:

[1] 算法导论

[2] 一篇讨论红黑树的好文章:http://imlazy.ycool.com/post.1104022.html

你可能感兴趣的:(红黑树)