关联式容器之RB-tree红黑树

1.每个节点不是红色就是黑色

2.根节点是黑色

3.如果节点为红,其子节点必须为黑

4.任一节点至NULL(树尾端)的任何路径,所含之黑节点数必须相同

这意味着新增节点必须为红、新增节点之父节点必须为黑(主要条件),如果不满足则必须调整颜色并且旋转树形

5 总结(当P父亲为红,插入节点X为红时,会产生冲突的解决方法)

外侧插入、伯父节点为黑,那么单旋转一次

内侧插入、伯父节点为黑,双旋转一次(单旋转两次)

外侧插入、伯父节点为红,如果曾祖父节点为黑,单旋转一次

外侧插入,伯父节点为红,曾祖父为红,持续向上改变颜色(如果某节点的两个子节点皆为红,就把该节点改为红,两个子节点改为黑)

6 红黑树的节点设计

红黑两种颜色是用bool类型表示的

minimum,一直找左子树的左子节点

static base_ptr minimum(base_ptr x){     while(!x->left){         x = x->left;     }     return x; }

同样 maximum,一直找右子树的右子节点

static base_ptr maximum(base_ptr x){     while(!x->right){         x = x->right;     }     return x; }

节点结构

_rb_tree_node是一个结构,包含了红黑树数据结构的基本内容

struct rb_tree_node_base{     typedef _rb_tree_color_type color_type;     typedef_rb_tree_node_base* base_ptr;     color_type color;     base_ptr parent;     base_ptr left;     base_ptr right;  }

红黑树迭代器设计

STL红黑树的设计分为两层

base层

主要包含两个函数increment和decrement

正规层

7 红黑树的数据结构

迭代器终于出场了,它的类型别名定义是这样的

构造函数

init主要产生一个header

8.  红黑树构造

9. 一开始就觉得很奇怪的点是根节点的parent是指向什么,看到这里我明白了,根节点的parent就是header

                  

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值