红黑树的基本原理
2016-07-28 08:18
323 查看
转载地址: http://blog.csdn.net/u014397560/article/details/38656637
红黑树的特性
红黑树是一种平衡二叉树。不过与AVL树非常严格的平衡不同,红黑树是一种局部平衡,确保没有一条路径会比其他路径长出两倍。
STL中的关联式容器默认的底层实现都是红黑树。
红黑树遵循以下原则:
1. 根节点是黑色
2. NIL(叶子)节点是黑色
3. 节点的颜色只能是黑色或者红色(删除节点时会用到这个原则)
4. 红色节点的两个字节点一定是黑色
5. 对于每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑色结点。
红黑树的插入
首先,按照搜索树的性质插入节点,并把节点标记为红色。(1)
接着,调节红黑树:
Ø 如果插入节点是根节点,将节点涂黑,插入结束。
Ø 如果插入节点不是根节点,
Ø 如果插入节点的父节点是黑色,红黑树性质不被破坏,插入结束。
Ø 如果插入节点的父节点是红色,则:
Ø 当叔节点(父节点的兄弟节点)是红色时,父节点P、叔节点S、祖父节点G变换颜色;当前节点指向祖父节点G。循环调整红黑树。
Ø 当叔节点时黑色时:
Ø 从内侧插入,则以插入节点I和父节点P为轴,进行单旋,变成从外侧插入。循环调整红黑树。(2)
Ø 从外侧插入,则以父节点P和祖父节点G为轴,进行单旋,并改变父节点和祖父节点的颜色。插入结束。(3)
注释:
(1) 将插入节点标记为红色的原因是,插入黑色节点会增加经过该节点的所有路径的黑色节点数目,导致原则5被破坏。而原则5是最难调整的,故应避免。
(2)
红黑树的删除
记
Z:需要删除的节点
Y:实际删除的节点
X:Y的子节点
首先,按照搜索树的性质删除节点,不改变红黑树节点的颜色。
接着,调整红黑树:
Ø 如果删除的是根节点,直接删去。删除结束
Ø 如果删除的不是根节点,
Ø 如果删除的节点Y是红色,红黑树不被破坏,删除结束。(1)
Ø 如果删除的节点Y是黑色,Y的黑色被加在其子节点X上,则:(2)
Ø 如果X为红色,即X为红+黑,则直接将X变成黑色。删除结束
Ø 如果X为黑色,即X为黑+黑,则:
Ø 如果X的兄弟节点W为红色,以父节点P和兄弟节点X为轴,进行一次单旋并交换颜色。删除结束。(3)
Ø 如果X的兄弟节点W为黑色:
Ø 兄弟节点W的两个子节点都是黑色,则X和S脱掉一层黑色,加到他们的父节点上。以父节点为当前节点,循环调整红黑树。
Ø 兄弟节点W的右节点为黑色时,交换W和其左子节点K的颜色,并以WK为轴交换,单旋,变成兄弟节点W的右节点为红色的情况。循环调整红黑树。(4)
Ø 兄弟节点W的右节点为红色时,以兄弟节点W和父节点P为轴,进行单旋。变换后的W节点的颜色跟原来父节点P的颜色一致,W的两个子节点变为黑色。删除结束。(5)
注释:
(1) 删除红色节点,不会破坏红黑树的原则。
(2) 删除黑色节点,会破坏原则5,而原则5被破坏影响的是全局,这样要调整红黑树就比较困难了。所以,我们把被删除的节点的黑色加到它的子节点X上,再调整红黑树。这样,X就会具备黑-黑或者红-黑两种黑色,破坏了原则3,但相对于原则5的杀伤力,还是可以接受的。
接下来,要考虑的就是如何处理X上面多出来的一层黑色。如果是红+黑,直接涂黑既可。如果是黑+黑,则要分情况去掉X上的黑色。
(3)
(4)
(5)
红黑树的特性
红黑树是一种平衡二叉树。不过与AVL树非常严格的平衡不同,红黑树是一种局部平衡,确保没有一条路径会比其他路径长出两倍。
STL中的关联式容器默认的底层实现都是红黑树。
红黑树遵循以下原则:
1. 根节点是黑色
2. NIL(叶子)节点是黑色
3. 节点的颜色只能是黑色或者红色(删除节点时会用到这个原则)
4. 红色节点的两个字节点一定是黑色
5. 对于每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑色结点。
红黑树的插入
首先,按照搜索树的性质插入节点,并把节点标记为红色。(1)
接着,调节红黑树:
Ø 如果插入节点是根节点,将节点涂黑,插入结束。
Ø 如果插入节点不是根节点,
Ø 如果插入节点的父节点是黑色,红黑树性质不被破坏,插入结束。
Ø 如果插入节点的父节点是红色,则:
Ø 当叔节点(父节点的兄弟节点)是红色时,父节点P、叔节点S、祖父节点G变换颜色;当前节点指向祖父节点G。循环调整红黑树。
Ø 当叔节点时黑色时:
Ø 从内侧插入,则以插入节点I和父节点P为轴,进行单旋,变成从外侧插入。循环调整红黑树。(2)
Ø 从外侧插入,则以父节点P和祖父节点G为轴,进行单旋,并改变父节点和祖父节点的颜色。插入结束。(3)
注释:
(1) 将插入节点标记为红色的原因是,插入黑色节点会增加经过该节点的所有路径的黑色节点数目,导致原则5被破坏。而原则5是最难调整的,故应避免。
(2)
红黑树的删除
记
Z:需要删除的节点
Y:实际删除的节点
X:Y的子节点
首先,按照搜索树的性质删除节点,不改变红黑树节点的颜色。
接着,调整红黑树:
Ø 如果删除的是根节点,直接删去。删除结束
Ø 如果删除的不是根节点,
Ø 如果删除的节点Y是红色,红黑树不被破坏,删除结束。(1)
Ø 如果删除的节点Y是黑色,Y的黑色被加在其子节点X上,则:(2)
Ø 如果X为红色,即X为红+黑,则直接将X变成黑色。删除结束
Ø 如果X为黑色,即X为黑+黑,则:
Ø 如果X的兄弟节点W为红色,以父节点P和兄弟节点X为轴,进行一次单旋并交换颜色。删除结束。(3)
Ø 如果X的兄弟节点W为黑色:
Ø 兄弟节点W的两个子节点都是黑色,则X和S脱掉一层黑色,加到他们的父节点上。以父节点为当前节点,循环调整红黑树。
Ø 兄弟节点W的右节点为黑色时,交换W和其左子节点K的颜色,并以WK为轴交换,单旋,变成兄弟节点W的右节点为红色的情况。循环调整红黑树。(4)
Ø 兄弟节点W的右节点为红色时,以兄弟节点W和父节点P为轴,进行单旋。变换后的W节点的颜色跟原来父节点P的颜色一致,W的两个子节点变为黑色。删除结束。(5)
注释:
(1) 删除红色节点,不会破坏红黑树的原则。
(2) 删除黑色节点,会破坏原则5,而原则5被破坏影响的是全局,这样要调整红黑树就比较困难了。所以,我们把被删除的节点的黑色加到它的子节点X上,再调整红黑树。这样,X就会具备黑-黑或者红-黑两种黑色,破坏了原则3,但相对于原则5的杀伤力,还是可以接受的。
接下来,要考虑的就是如何处理X上面多出来的一层黑色。如果是红+黑,直接涂黑既可。如果是黑+黑,则要分情况去掉X上的黑色。
(3)
(4)
(5)
相关文章推荐
- PHP 笔记
- 就是这个foxmail有时出现记事同步不了
- Quartz2D-饼状图
- CF #364 (Div. 2)( A. Cards 简单模拟)
- Appcan页面跳转
- POI导入导出工具类
- PHP基础之 file_get_contents() 函数
- 开启硬件辅助虚拟化
- An invalid form control with name='xxx' is not focusable
- Yii2.0 ajax多条件搜索 返回json数据格式
- js基本简介(了解)
- Class.forName VS ClassLoader.loadClass
- LeetCode[319] Bulb Switcher
- IIS上虚拟目录下站点的web.config与根站点的web.config冲突解决方法
- 视频播放vitamio
- CEWL
- Android第四十三天
- 【笔记】JS基础一
- rsync同步的艺术
- C#新手入门代码 控制台清屏