红黑树-关联式容器的底层实现之一

在前面我们讲到了容器分为大致两种,一种序列式的,一种关联式的。

这里要讲的就是关联式容器的底层机制之一 红黑树

 

在讲红黑树之前,我们必须要明白 二叉搜素树,平衡二叉搜素树,旋转等概念。

所以可以先参考这几篇博客:

二叉搜索树:http://blog.tk-xiong.com/archives/476

平衡二叉搜索树:http://blog.tk-xiong.com/archives/492

四种旋转 http://blog.tk-xiong.com/archives/494

接下来的文章都默认以上内容读者是已经清楚明了的…

 

RB-Tree(红黑树)

除了AVL树之外,还有一种平衡二叉搜索树叫做RB-Tree

除了是一个二叉搜索树之外,还具有以下规则:

  1. 每个节点不是红色就是黑色
  2. 根结点为黑色
  3. 如果一个结点为红色,则它的子节点必须为黑色
  4. 任一节点到树尾端(NULL)的任何路径,黑色节点数量必须相同

遵守以上规则,我们才能得到一个标准的RB-Tree.

 

RB-Tree 插入节点:

根据前面提到的规则4,我们可以得到以下结论:新插入的结点必须是红色

然后根据规则3,我们可以知道新插入的结点的父节点必须是黑色

如果新插入的结点不满足上述条件时,就必须调整颜色,旋转树形

首先我们来看看下图,分析一下为什么下面这几种情况都不合理:

RB-Tree1

分析完上述的原因后,我们会根据以下四种情况进行旋转变色调整。

当然为了方便我们进行讨论,做出以下规定:

  • 新插入节点为X
  • 父节点为P
  • 祖父节点为G
  • 父节点的兄弟节点为S
  • 曾祖父节点为G&G

根据RB-Tree的规则,我们知道,X的颜色必为红色。

如果P也是红色,则会违反规则,就需要调整

如果P是黑色,不会违反规则

那么根据规则3,我们可以知道P的父节点G肯定是黑色。(规则3)

于是我们可以得到同旋转一样的以下四种情况:

这里我决定再开一个帖子,认真描述下这四种情况。

RB-Tree的四种调整情况: http://blog.tk-xiong.com/archives/803

 

然后接下来,我们来看看

RB-Tree 的结点设计:

RB-Tree拥有,红黑二色,拥有左右子节点,以下是SGI实现源码:

这里要注意的是,有三个指针,两个子节点,一个父节点。

同时根据Max 和 Min函数可以看出,二叉搜索树得到极值真是太容易!

 

RB-Tree 的迭代器:

要成功地将RB-Tree实现为一个泛型容器,迭代器的设计是一个关键。

首先要考虑了类别(category),它要具备前进(increment)、后退(decrement)、提领(dereference)、成员访问(member access)等操作。

为了更大的弹性,SGI将 RB-Tree的迭代器设计为两层,这种设计理念和slist类似。

下图便是两层迭代器的示意图,描述了双层节点结构和双层迭代器结构之间的关系。

RB-Tree-Iterator

RB-Tree的迭代器属于双向迭代器,但不具备随机定位能力。

基层迭代器实现如下:

正式迭代器实现如下:

以上似乎没什么要注意的…比较好理解。

对于上述的base_iterator 里面比较难以理解的两个++–内部实现…

可以通过以下图来尝试看一下:

RB-Tree-Node

 

RB-Tree的数据结构:

以上就是RB-Tree的数据结构…可以慢慢理解,我觉得前面看了那么多,现在也该适应了。

 

RB-Tree的构造与内存管理:

这里构造和析构,空间配置都在前面展示出来了

这里要注意的是init()这个函数的一个实现技巧:

RB-Tree-init

 

RB-Tree 的元素操作:

这一节主要只谈元素的插入和搜寻。

RB-Tree提供两种插入方式:独一无二的插入和可重复的插入。

首先看看可重复的:insert_equal()

然后是不可重复的:insert_unique() :

 

然后看一下真正的插入程序 __insert() :

__insert()函数是真正的插入函数…

 

然后接下来我们看看调整RB-Tree结构和颜色的函数。

这就是那个由上而下的调整程序,也是前面提到的RB-Tree的调整代码。

然后接下来看看RB-Tree左旋和右旋的代码:

这段对照着前面的左旋右旋的情况看吧…

 

然后扯一下元素的查找…

好了,就这样了…理解了就好。反正我还不懂。

但是大致流程都清楚了。

【STL】RBTree
Tagged on:
0 0 投票数
Article Rating
订阅评论
提醒

0 评论
最新
最旧 最多投票
内联反馈
查看所有评论