红黑树的基本性质

本文深入解析红黑树的基本性质,探讨插入与删除操作对红黑树的影响及调整策略,包括性质破坏的修复方法,如旋转与颜色翻转,确保树的平衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

红黑树的基本性质

1) 每个节点或是红色的,或是黑色的。
2) 根节点是黑色的。 
3) 每个叶节点(NIL)是黑色的。
4) 如果一个节点是红色的,则它的两个子节点都是黑色的。 
5) 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

红黑树插入时,如果插入红色节点则

(由于插入黑色节点一定会导致性质五被破坏,所以考虑插入为红色节点的情况)

  1. 性质一不会破坏
  2. 性质二可能破坏
  3. 性质三不会被破坏
  4. 性质四可能被破坏
  5. 性质五不会被破坏

当插入导致性质被破坏时需要调整:
由上面所述,只有性质二和四可能被破坏,而性质二只有在插入之前为空树时可能被破坏。所以我们需要关注性质四,即插入导致两个红色节点连在了一起。下面分情况表述:

  • 1.插入的节点为根节点:**若插入前无任何节点,则插入后的节点为根节点直接设置为黑色即可。
  • 2.插入的节点的父节点为黑色节点:**无需做任何改变因为不会影响红黑树性质
  • 3.插入的节点的父节点为红色且uncle节点也是红色:** 此时将导致两个红色节点连接到了一起,此时我们考虑改变两个红色节点之中的一个,然而改变插入节点的颜色显然是无意义的,(如果改变相当于插入黑色节点),所以我们将插入节点的父节点设置为黑色,然而这样同时会导致性质五的违背,所以我们将其uncle节点也设置为黑色,并将parent的parent节点设置为红色,此时调整完成。插入节点为M,如下图:
    3d65bdf1eef44c8d9856bcc9dba0f572-image.png
    (图片来源于网络)
  • 4.插入节点的父节点为红色且uncle节点为黑色(T.nil也为黑色),插入节点为右节点:**以插入节点的的父节点作为支点左旋变成情况5,再调整

    (图片来源于网络)
  • 5.插入节点父节点为红色,uncle节点为黑色(T.nil为黑色),插入节点为的左子节点:**将parent节点设置为黑色,parent的parent节点设置为红色,并以parent节点为支点右旋。

    (图片来源于网络)

删除节点:

当我们删除一个节点时,z指向删除节点,y指向替换删除删除节点的节点,x指向y的右子树,首先按照二叉搜索树的的删除方式进行删除,并在其中加入部分代码记录Y的踪迹和y的初始颜色,还有x的踪迹(见《算法导论》第三版183页)。
删除节点的过程:当z只有一个子树时,y指向该子树,并直接将子树y替换z,当z有两个子树时选择右子树的最左侧节点作为y,并用y替换z,并用x替换y,并进行red-black tree调整。
所以实际过程相当于删除Y

当y是红色时,删除后不会影响红黑树的基本性质,可直接删除

当如果y是黑色,会出现如下三种情况:

1.如果原先的y是根节点,y的红色x替换y将导致违反性质2
2.如果替换后x和x的父节点都为红色则违反性质4
3.y在树中移动将导致包含y的任何简单路径和高度减一。

所以我们需要对y为黑色节点时被x替换后的树进行调整。
由于懒得画图使用网络图片~~~~这时N上文所述的x

1.如果N的兄弟节点为红色时

将B设置为黑色,N的父节点P设置为红色,然后以P为中心左旋转,则转换情况2

(图片来源于网络)

2.如果N的兄弟节点为黑色,并且两个子节点都为黑色(包括T.nil):

将N的兄弟节点B变红,然后用N的父节点P作为新的N,进行递归操作。因为N是P的左子树,P的左子树路径中,删除N后,会缺少一个黑色节点,因此递归的将右树上的路径也减少一个黑色节点,知道N的颜色为红色。最后把当前的N节点置为黑色。最后产生的结果就是将右侧的黑色节点上移,这样右子树和左子树都没有减少黑色节点。

(图片来源于网络)

3.如果N的兄弟节点B是黑色的他的左孩子为红色,右孩子为黑色

将B变红,b1变黑,然后以B为中心右旋,则转换为情况4

(图片来源于网络)

4.如果N的兄弟节点B是黑色他的右孩子为红色,左孩子可红可黑

将B的颜色设置为与P的颜色一致,然后P和b2设置为黑色,以P为中心左旋。

(图片来源于网络)
至此正文结束
分割线------------------------------------------------------------------------
花了我整整一下午加一晚上时间才看懂了此算法,并立刻跟新博客,也为以后如果忘记也是一个不错的复习资料,不过很开心今晚的迎新晚会很棒棒~~~~~~,不早了再不睡要猝死啦。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值