STL学习 红黑树学习

一、红黑树

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(),所以它能够插入相同的键值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值