一、红黑树
RB-tree是被广泛运用的平衡二叉搜索树。
这里只是记录一下我个人觉得重要的东西,就没有图了。
强烈推荐《STL源码分析》这本书,上面讲得比较清楚。
1.1规则
(1)每个节点不是红色就是黑色。
(2)根节点为黑色。
(3)如果节点为红,则其子节点为黑。
(4)任一节点至BULL(树尾端),黑节点数必须相同。
1.2一个由上而下的程序
插入时红黑树的平衡是由各种旋转来保证的,大概有四种不同的旋转情况,别的博客里都有,
而为了防止出现父子节点皆为红色,并且不断向上衍生的情况。
我们需要设置一个程序:
(1)假设新增节点为A,那么就沿着A的路径,只要看到有某个节点X的两个子节点皆为红色,就把X改为红色,子节点为黑色
(2)如果X的父节点也为红色,那么就要做一次单旋转(或双旋转)并改变颜色
这样做以后,就可以减少插入时的复杂度。
1.3红黑树的迭代器
以实现operator++举例,其他的也差不多:
++主要是递增到比当前节点大一点的数据,对于当前节点X
(1)X如果有右子节点,则进入并且一直往左走到底
(2)X如果没有右子节点,则一直上溯,直到不为右子节点为止
(3)如果此时的右子节点不等于此时的父节点,此时的父节点即为解答
(4)否则此时的node为解答
1.4元素插入操作insert_unique()与insert_equal()
这是红黑树提供的两种插入操作,insert_unique()要保证插入的键值在整个树中独一无二,insert_equal()则表示插入的键值在整棵树中可以被重复。
正因为如此,set与multiset的特性和用法与set相同,但是差别就在于multiset采用了红黑树的insert_equal(),所以它能够插入相同的键值。