STL关联式容器之RB-tree(红黑树)(一)

RB-tree(红黑树)
AVL-tree之外,另一个颇具历史并被广泛运用的平衡二叉搜索树是RB-tree(红黑树),所谓RB-tree,不仅是一个二叉搜索树,且必须满足以下规则:

  1. 每个节点不是红色就是黑色(图中深色底纹代表黑色,浅色底纹代表红色,下同);
  2. 根节点为黑色;
  3. 如果节点为红色,其子节点必须为黑色;
  4. 任一节点到null(树尾端)的任何路径,所含的黑色节点数必须相同。
    根据规则4,新增节点必须为红;根据规则3,新增节点之父节点必须为黑。当新节点根据二叉搜索树的规则到达其插入点,却未能符合上述条件时,就必须调整颜色并旋转树形。
    在这里插入图片描述
    插入节点
    假设为上图的RB-tree分别插入3,8,35,75,根据二叉搜索树的规则,这四个新节点的落脚出应该如下图所示。显然它们都破坏了RB-tree的规则,因此必须调整树形,旋转树形并改变节点的颜色。
    在这里插入图片描述
    为了方便讨论,为某些特殊节点定义一些代名:假设新节点为X,其父节点为G,伯父节点(父节点之兄弟节点)为S,曾祖父节点为GG。现在根据二叉搜索树的规则,新节点,新节点X必为叶节点。根据红黑树规则4,X必为红。若P为红就违反了规则3,必须调整树形,则G必为黑(因为原为RB-tree,必须遵循规则3)。于是,根据X的插入位置及外围节点(S和GG)的颜色,有了一下四种考虑:
    状况1:
    S为黑且X为外侧插入。对此情况,我们先对P,G做一次单旋转,并更改P,G颜色,即可重新满足红黑树的规则3:
    在这里插入图片描述
    注意,此时可能产生不平衡状态(高度相差1以上)。例如图中的A和B为null,D和或E不为null。这倒是没关系,因为RB-tree的平衡性不来就比AVL-tree弱,然而RB-tree通常能够导致良好的平衡状态。通常情况下,RB-tree的搜寻平均效率和AVL-tree几乎相等。
    状况2:
    S为黑且X为内侧插入,必须先对P,X做一次单旋转并更改G,X颜色,再将结果对G做一次单旋转,即可再次满足红黑树规则3。
    在这里插入图片描述
    状况3:
    S为红且X为外侧插入。对此情况,先对P和G做一次单旋转,并改变X的颜色。此时如果GG为黑,一切搞定,但若GG为红,则问题就比较大。
    在这里插入图片描述
    状况4:
    S为红且X为外侧插入。对此情况,先对P和G做一次单旋转,并改变X的颜色,如果此时GG亦为红,还得持续往上做,直到不再有父子连续为红的情况》
    在这里插入图片描述
    为了避免状况4“父节点皆为红色”的情况持续向RB-tree的上层结构发展,形成处理时效的瓶颈,我们可以施行一个由上而下的程序(top-down-procedure):假设新增节点为A,那么就延着A的路径,只要看到有某节点X的两个子节点皆为红色,就把X改为红色,并把两个子节点改为黑色。
    在这里插入图片描述
    但是如果X的父节点P亦为红色(注意,此时S绝不能为红),就得像状况1一样地做一次单旋转并改变颜色,或是像状况2一样地做一次双旋转并改变颜色。
    在此之后,节点35的插入就很单纯了:要么直接插入,要么插入后(若X节点为红)再做一次旋转(单双接可能)即可:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值