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

2.根节点是黑色

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

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

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

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

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

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

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

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

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

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

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

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

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

6 红黑树的节点设计

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

红黑两种颜色是用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红黑树

_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

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

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

正规层

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

7 红黑树的数据结构

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

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

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

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

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

构造函数

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

init主要产生一个header

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

8.  红黑树构造

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

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

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

                  

 

 

 

相关文章:

  • 2021-04-08
  • 2021-06-16
  • 2021-07-10
  • 2021-10-26
  • 2021-07-17
  • 2021-08-01
  • 2022-12-23
猜你喜欢
  • 2021-06-30
  • 2022-12-23
  • 2021-06-19
  • 2022-01-15
  • 2021-10-12
  • 2022-12-23
  • 2021-09-10
相关资源
相似解决方案