B树 红黑树

本文详细介绍了B树的插入和删除操作,包括节点分裂、合并及高度调整。同时,阐述了红黑树的特性,如颜色规则和插入后的平衡调整策略,包括颜色翻转和旋转操作。删除节点时,针对不同情况讨论了如何保持红黑树的平衡。
摘要由CSDN通过智能技术生成

B数

m阶B树根节点有[2,m]个儿子,根节点外除叶子结点每个节点有[(m+1)//2, m]个儿子。内节点(关键码)数比儿子数少1。

插入

在叶子结点处插入,然后向上处理。每次如果当前内节点数量超过限制,就让偏右中间的那个内节点上升,两边分裂,如此递归。只有在根节点处上升时抬高整个树的高度。

删除

如果目标不在叶子节点中,则找到这个点的后继,即挨着这个关键码的右边子树内一直向左走到达的节点的最左关键码,然后交换后继和目标。删除关键码后,节点可能儿子数量小于要求值(自然,数量为下限-1)。分几种情况处理:

  1. 如果左右兄弟有儿子数比下限多1以上的,让他的挨着这边儿的内节点上升,代替父亲节点中夹着的内节点,被代替的内节点下降,取代要删除的内节点。
  2. 否则,左右兄弟中一定至少有一个存在且具有下限个儿子。那么让父亲节点中夹着的内节点下降,粘结这个兄弟和自己。合成的节点儿子数必然不超过上限。这样父亲节点可能儿子数量不够,递归处理即可。

外部节点

真的或假的,父亲(至少)有2儿子,自己没有儿子。

红黑树

根黑;外部节点黑;红节点父亲、儿子黑;所有外部结点黑深度相等。

插入

插入成叶子结点。先将自己染红,然后检查自己,如果父亲红则进入修正处理。修正一个节点的条件是自己红且两儿子黑,且父亲红(若存在父亲)。如上所述,外部节点黑,所以新节点自然满足两儿子黑这个条件。修正步骤如下:

  1. 如果舅舅黑:考察自己、父亲、爷爷的大小关系,让居中的人变黑(自己或父亲),两边的人变红,并变成变黑节点的两个儿子。有些子树要进行自然吸附处理(像splay的rotate里那样)。
  2. 如果舅舅红:父亲、舅舅变黑,爷爷变红,递归检查爷爷。
  3. 如果自己已经是根:自己变黑。此时树的黑高度加一。

删除

用经典的BST方法,非叶子节点的删除实际上是用前驱或后继节点替换本节点,然后删除前驱还后继节点。那么实际上删除的节点一定最多有一个儿子。假设没有儿子的那边是黑色(如果两边都没有儿子,那自然也都是黑色)。

  1. 如果被删除节点和其儿子有一个红(一个黑),那么在自己消失、儿子上升后让儿子染黑色即可。这样满足黑高度要求。
  2. 如果两节点均黑,则让儿子代替自己(即被删除节点)后进入改造处理。

改造处理一个节点分以下几种情况:

  1. 自己的兄弟黑且至少有一个红儿子。称这个红儿子(有两个则随便选一个)为团长。又分两种情况:
    1. 团长、兄弟、父亲在一条线上(zigzig)。这时让这条线上三者的颜色顺次下降一格,将父亲设为黑色。然后rotate兄弟即可。
    2. zigzag情况。让团长直接获得父亲的颜色,父亲设为黑色。然后rotate两次团长。实际上就是大小居中的人上去。
  2. 兄弟黑,且没有红儿子(团长——)。此时让兄弟变红,然后看父亲。若父亲红,则变黑。否则递归改造父亲,此时黑高度减少。
  3. 兄弟红:兄弟变黑,父亲变红,rotate兄弟,然后再改造自己,不会出现递归。
  4. 自己是根:什么都不做。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值