红黑树核心原理
来源:互联网 发布:挂号网软件 编辑:程序博客网 时间:2024/06/01 08:48
- 红黑树核心原理
红黑树核心原理
红黑树是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会超过二者中较低那个的一陪。具体来说,红黑树是满足如下条件的二叉查找树(binary search tree):
- 每个节点要么是红色,要么是黑色。
- 根节点必须是黑色
- 红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。
- 对于每个节点,从该点至null(树尾端)的任何路径,都含有相同个数的黑色节点。
在树的结构发生改变时(插入或者删除操作),往往会破坏上述条件3或条件4,需要通过调整使得查找树重新满足红黑树的条件。
左旋
右旋
在讨论红黑树的插入操作之前必须要明白,任何一个即将插入的新结点的初始颜色都为红色。这一点很容易理解,因为插入黑点会增加某条路径上黑结点的数目,从而导致整棵树黑高度的不平衡。但如果新结点的父结点为红色时(如下图所示),将会违反红黑树的性质:一条路径上不能出现相邻的两个红色结点。这时就需要通过一系列操作来使红黑树保持平衡。
(1)父黑
直接插入,不影响树结构。
(2.1)父红叔红
无需进行旋转操作,只要将父和叔结点变为黑色,将祖父结点变为红色即可。但由于祖父结点的父结点有可能为红色,从而违反红黑树性质。此时必须将祖父结点作为新的判定点继续向上(迭代)进行平衡操作。
新插入的21的颜色置为红色
将其双父变黑,上层再2遍红(迭代)
显然整棵树都平衡了。但是还有有问题。根节点颜色成了红色,这个好办,直接设置根节点颜色为黑色即可。于是整棵树平衡。
(2.2)父红叔黑
需要旋转和变色操作。
如插入7:
明显插入的节点7已经破坏平衡,并且父亲是红色,叔叔是NIL(黑色),这个时候我们又该怎么办呢?
这个时候假设我们能把6放到1的位置,1变成6的左孩子,并且交换1和6的颜色,那么是不是平衡了呢?
是不是很神奇呢?其实这个操作的名字叫做树的旋转。注意:设置颜色不是旋转的一部分。上面采用的就是树的左旋,以1作为旋转点(需要旋转的子树的根节点)
删除操作相比插入更加复杂。
第一:先看最简单情况,即删除红色节点。删除红色节点,不影响红黑树平衡性质,如图:
只需要删除红色节点,不需要进行调整,因为不影响红黑树的性质。 黑色节点没有增多也没有减少。
注意:以下几种单支情况在平衡的红黑树中不可能出现。
因为上述的情况,红黑树处于不平衡状态。(破坏到null,黑色节点数目相同)
所以,平衡状态下红黑树要么单支黑-红,要么有两个子节点。
第二:删除单支黑节点(情况复杂,以后研究)。
- 红黑树核心原理
- struts2核心工作原理
- struts2原理核心
- Struts2核心原理
- spring核心原理
- SpringMVC 的核心原理
- GeoHash: 核心原理
- asp.net核心原理
- GeoHash核心原理解析
- 《逆向工程核心原理》
- spring核心原理
- 《逆向工程核心原理》
- SPRINGMVC的核心原理
- SpringMVC的核心原理
- GeoHash核心原理解析
- GeoHash核心原理解析
- GeoHash核心原理解析
- GeoHash核心原理解析
- Selenium小结
- c++内存管理
- s5pv210 中断学习笔记
- java实现二叉树的构建以及3种遍历方法
- 跟我学NodeJS(一)
- 红黑树核心原理
- zoj 3732 Graph Reconstruction 构造
- Sybase Describe对应sql
- java动态代理
- Java操作Json数组
- Opentsdb 2.3 Writing data(二)
- shell中各种括号的作用()、(())、[]、[[]]、{}
- D
- 实验楼Linux基础入门(新版)- 历史命令