原文地址:http://blog.sina.com.cn/s/blog_60707c0f01011zz1.html
0 定义
①每个结点一定是红色或者黑色;
②根结点一定是黑色的;
③每个外结点也是黑色的;
④如果一个内结点是红的,那么两个儿子都是黑色的;
⑤从任意一个内结点出发,到其子孙任意外结点的所有路径的黑结点都相等;
其中⑤决定了具有n个内结点的红黑树的高度不会超过2lg(n+1),与AVL相比,在复杂度上几乎是一样的,但是它没有AVL那么讲究平衡性能,但是在旋转操作的次数(最多两次)上比AVL的最坏的平均性能要好很多,如下图就是一棵红黑树:
1 旋转
//Created by pritry #define RB_RED 0 #define RB_BLACK 1 struct rb_tree { }; void rb_rotate_left(rb_tree** T, rb_tree* node) { } void rb_rotate_right(rb_tree** T, rb_tree* node) { } |
2 插入
插入的方法与二叉排序树一样,最后染色为红色,然后进行分对称的三种情况来进行调节结点颜色,旋转次数不超过两次,这比AVL显然好很多。①node的叔叔是红色;②node的叔叔是黑色,且node是爸爸的右孩子;③node的叔叔是黑色,且node是爸爸的左孩子,由于对称性我们引入一个依次插入{12,10,8,6,7}的例子来构造红黑树,插入12后结点的12为黑色且为根结点,如下所示:
插入结点10,结点10为红色,无需旋转和染色,如下所示:C++代码如下:
//Created by pritry void rb_insert_node(rb_tree** T, rb_tree* node) { } void rb_insert_color(rb_tree** T, rb_tree* node) { } void rb_insert(rb_tree** T, rb_tree* node) { } |
3 删除
//Created by pritry void rb_delete_color(rb_tree** T, rb_tree* node) { } rb_tree* rb_delete_node(rb_tree** T, rb_tree* node) { } rb_tree* rb_delete(rb_tree** T, rb_tree* node) { } |