红黑树的基本原理
来源:互联网 发布:js array push index 编辑:程序博客网 时间:2024/05/21 07:09
图片来自:http://blog.csdn.net/hackbuteer1/article/details/7760584
红黑树的特性
红黑树是一种平衡二叉树。不过与AVL树非常严格的平衡不同,红黑树是一种局部平衡,确保没有一条路径会比其他路径长出两倍。
STL中的关联式容器默认的底层实现都是红黑树。
红黑树遵循以下原则:
1. 根节点是黑色
2. NIL节点是黑色
3. 节点的颜色只能是黑色或者红色(删除节点时会用到这个原则)
4. 红色节点的两个字节点一定是黑色
5. 任一节点到NIL的任何路径,经过的黑色节点数一致
红黑树的插入
首先,按照搜索树的性质插入节点,并把节点标记为红色。(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)
- 红黑树的基本原理
- 红黑树的基本原理
- 映射的基本原理
- 基本原理,编写的技术
- 嗅探的基本原理
- 分布式计算的基本原理
- PPP驱动程序的基本原理
- SSO的基本原理
- VBA 的基本原理
- HTTP断点续传的基本原理
- 数据库连接池的基本原理
- 嗅探的基本原理
- 聚集的基本原理
- AOI的基本原理
- 局域网监听的基本原理
- 视频编码的基本原理
- 彩信的基本原理
- 通信的基本原理
- sicily 1193
- Hadoop2.4.1 hadoop dfs(fs)指令大全
- Oracle数据库共享连接和专用连接方式比较
- POJ 2406 Power Strings
- HDU 4939 Stupid Tower Defense (DP)
- 红黑树的基本原理
- Java异常种类
- 分页语句的深入研究
- pkg_resources.DistributionNotFound: pip==0.8.2
- iOS app发现严重BUG后的紧急处理
- cocos2d-x3.2用游戏截屏功能提取 Flappy Bird 资源中的单张图片
- matlab学习------输入对话框inputDlg,目录选择对话框uigetdir,列表选择对话框listdlg
- 申请付费开发者账号
- ALTERA公司FPGA的命名规则