先样子,先把红黑树的性质贴上:
性质1. 节点是红色或黑色
性质2. 根是黑色
性质3. 所有叶子都是黑色(叶子是NIL节点)
性质4. 如果一个节点是红的,则它的两个儿子都是黑的
性质5. 从任一节点到其叶子的所有简单路径都包含相同数目的黑色节点。
下面直接写插入方法,像查找树的添加、删除、及树的旋转不再说了,不懂的再查其他资料
1.插入节点默认为红色,为什么 ?
红色不破坏性质5,性质5是最难维护的一个性质,性质5的破坏,直接破坏了整个树的结构,所以插入点默认为红色
那么插入红色最易破坏的性质是 2、4,插入过程也是围绕保持这个两性质来进行的
2、插入演示(插入点为x,父亲 p(x),叔叔为 y)
1、如果插入点为的父亲结点为黑色,不会破坏性质2和4,所以不要做任何操作
1、如果插入点父亲为红色,那么开始树的调整,父亲结点为红色,也分为三种情况
1.1叔叔为红
1.2叔叔为黑,x 为 p(x) 右孩子
1.3叔叔为黑,x 为p(x)右孩子
先说1.1情况:如下图
为使保持性质4不变,就要把P颜色设置为黑色,这样左分支就多了一个黑色结点,所以祖父要为红,这样才能保持左分支不变,但这时右分支少了祖父(祖父一定为黑色),所以要将 y 也转为黑色,这样在祖父以下的结点都满足性质,我们要将X指向祖父,继续循环
1.2父亲为红,叔叔为黑,X为左孩子:
将其父旋转,达到下图,其是为了达到第三种情况:
1.3叔叔为黑色,X为父亲左孩子
插入总结:
.插入后会出现什么情况?我们假设插入点为X,父亲结点为P,叔叔为Y,且X插入到父亲的左孩子中
1.当插入后父亲为黑时,不破坏树的性质,不做调整
2、当插入后父亲为红色时,破坏性质2、4,破坏性质2好说,直接将颜色改为黑色就可以了,但破坏了性质4就不好做了,下面我们来分析一下
性质4是说不可以存在两个连续的红结点,如果出现了,我们会怎么办,我们会把其中的一个染黑,(X或P)这样就可以维护性质四,但这样会使性质5被
破坏掉,因为变黑后会使某个路径上的黑高度加1,如果下图所示,如果染黑P,会使经过P路径上的黑高度加1,染黑X会使经过X路径上的黑高度加1,无论哪个都会使
祖父W左孩子路径上的黑高度加1,下面我们要做的是怎么才能使左孩子的黑高度再减一,我们发现在,祖父一定为黑色,如果我们将祖父右旋,左边黑高度会和原来相同,我们再来看右面,(说明一下,叔叔Y一定为黑,否则会满足1.1执行),右边也不会破坏性质4,但为了使性质5不被破坏,我们将旋转过去的结点W染红,这样就使整个树又满足了所有的性质
一句话,插入一个点会使可能会使某几个路径黑高度变化,我们要通过旋转可变色再次使它们的重新满足性质,这也是上面三种情况中前两种情况都向第三种情况转换的原因,因为它三种情况经过变色和旋转将它们最容易变成红黑树
其实插入相对而言是挺简单的,按照下面的3步写就可以了,写上面主要是说明像算法导论上讲的操作,只知道操作但不知道为什么要这样做,这里记录一下,可能有点乱或要更正的地方,仅一人见解。。。。