算法导论—红黑树

华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/9/9

红黑树是对二叉树的一种平衡扩展(节点高度差不超过2倍)。红黑树采用开放的数据扩张策略,并且对于诸如插入、查询,删除有 Θ( lg n) 的时间复杂度,因此也是一种应用比较广泛的数据结构。

一、红黑树的节点
节点属性:关键字key,节点颜色,左孩子指针,右孩子指针,父节点指针,卫星数据。
虚拟节点—NIL:对于红黑树中所有节点如果没有父节点或者缺少某个子节点,则把对应的指针指向同一个NIL。

二、红黑树的性质
1、每个节点的颜色是红色或黑色。
2、根节点是黑色。
3、每个叶节点是黑色。
4、如果一个节点是红色的,他的两个子节点都是黑色。
5、对于红黑树中的每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同个数的黑色节点。
节点的黑高:从该节点(不包含该节点)到任意一个叶子节点的任意一条简单路径上黑色节点的个数。

三、红黑树的旋转
这里确切的说应该是二叉树的旋转。因为这个旋转是为了保持二叉搜索树的性质。旋转操作包括一对可逆的操作:左旋和右旋。

四、红黑树的插入
红黑树的插入需要解决的问题是在保持黑高不变的前提下,解决父节点和子节点红红相遇的情况(如果涉及到把根节点拉下水的话,黑高就整体加一)。

如果插入节点父节点是黑色的,则不需要任何操作,本身就满足红黑树的所有性质。若插入节点和他的父节点都是红色的,这时如果插入节点叔节点是黑色的,则进行一次旋转即可构造出一颗红黑树。因此对于其他的情况目标就是构造出这种红黑树结构。

五、红黑树的删除
红黑树的删除需要解决的问题是删除节点或者等价删除节点黑高比其他节点少1的情况(如果涉及到把根节点拉下水的话,黑高就整体减一)。。

首先,如果删除节点或等价删除节点为红色,无需任何操作。如果是黑色,它的替代节点是红色只需把替代节点改为黑色即可。所以只需要考虑删除节点是黑色,且删除节点的替代节点也为黑色的情况。

因为替代节点这一支路上少了一个黑色节点(节点y)。因此他的祖先节点利用这一支路计算黑高的时候是比其它支路少一的。因此要想办法把这一支路增加一个黑色节点或者把其它所有支路黑高全部降一。

情况一:如果x的兄弟节点为红色,则x的兄弟节点肯定有两个不为nil的子节点(很显然)。所以这时让x的兄弟节点和x的父节点旋转。x可以得到一个黑色的兄弟节点。所以接下来只考虑x的兄弟节点为黑色的情况。
情况二:如果x的兄弟节点是黑色,且兄弟节点有两个黑色子节点。则考虑把兄弟节点拉下水(x的兄弟节点修改为红色即可)。x节点上移到x的父节点。
情况三:如果x的兄弟节点是黑色,且兄弟节点有两个子节点一黑一红。经过旋转调整为情况四。
情况四:如果x的兄弟节点是黑色,且兄弟节点有一个外侧红色子节点。旋转即可结束颜色调整过程。
补充:
1、采用红黑树结构的语言类型
STL: set,map
2、红黑树练习

算法导论—红黑树_第1张图片

你可能感兴趣的:(算法导论—红黑树)