红黑树 插入与删除 总结


红黑树删除

红黑树插入


插入点为x, 父结点为p, 伯父节点为w,爷爷节点为g.

插入操作:

以插入点作为基准,则只有父亲结点为红色才导致红黑树失去平衡。重新调整平衡大致有两种情况:

1. 伯父结点为红色

2. 伯父结点为黑色


伯父结点为红色

若伯父节点为红色,则爷爷节点为黑色。(爷爷结点黑色,父亲、伯父结点红色)

同时将伯父w与父亲p结点置为黑色,这样,插入点x与父亲p结点处平衡(即红-红消失),但爷爷g结点相对于其兄弟则多了

一个黑色结点,此时爷爷结点为黑色,则置为红色。但爷爷结点为红色后,可能平衡,也可能不平衡,因为如果爷爷的爸爸为红色,

那就不平衡,所以新一轮迭代相当于将插入了爷爷节点,即将爷爷结点视为x,进行新一轮迭代。



伯父节点为黑色:

1. 外侧插入

    为消除x 与 p的红-红性,可以将p置为黑色,这样左支相对于w支多了一个黑色结点。可以通过将爷爷结点g置为红色,然后以g为旋转点,

    将g旋转下来(右旋),平衡性得以保持。


2. 内侧插入

    左旋,转变为情形1进行处理。



删除操作:

删除相对于插入,则较为复杂。

普通二叉查找树删除一个结点后,如果右子树存在,则从右子树中寻找最小值结点替换删除结点(右子树最左结点)。

这样就保证了替换结点为单支;如果右子树不存在,则儿子结点替换父结点。情况2处理情况包含在情况1中。


对于情况1(右子树存在):可以这样假想,替换结点与欲删结点交换数据,不变更颜色,这样,相当于要删除替换结点,

而替换结点肯定是一个单支节点。


平衡的红黑树中,单支情况只有上述一种情况,其它情况均不满足:任意结点到空结点的任意路径,黑结点数目相等。


1. 若删除红结点,则不影响平衡性,直接删掉即可。


    上图中,欲删除结点y。用x 替换 y, 然后互换 x 与 y颜色。如果删除节点 y 颜色为红色,则直接删除,不影响平衡性。

2. 若删除黑结点,则黑色结点数量变少,失去平衡,需要调整。

    调整方法比较复杂,只需要记住,将树的形状尽量调整为伯父节点w的右儿子为红色,此种情况有解。

    情况1:(下图中已经将y删除,x替换了y的位置,而删除的y颜色为黑色)

    

    x的伯父w为红色,旋转,使x的伯父为黑色,因为x的伯父右儿子为红色的时候有解。


    情况2:

    

    伯父为黑色,且两个儿子都是黑色,则伯父置红,这样子树x, w黑色节点数一致,但c相对于其兄弟少一个黑色,

    将c置为x(new x),下一轮迭代。


     情况3:

     

    w右儿子为黑色,左儿子为红色,旋转,变成情况4,即右儿子为红色。


     情况4:

     

     w的右儿子为红色,左儿子颜色任意,交换c 与 w颜色,左旋,并将E,即w的右儿子置黑,这样,用这个黑色填补失去的那个黑色,达到平衡。


    

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值