红黑树---插入

先样子,先把红黑树的性质贴上:

性质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步写就可以了,写上面主要是说明像算法导论上讲的操作,只知道操作但不知道为什么要这样做,这里记录一下,可能有点乱或要更正的地方,仅一人见解。。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值