B树 红黑树
Posted myjs999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B树 红黑树相关的知识,希望对你有一定的参考价值。
B数
m阶B树根节点有[2,m]个儿子,根节点外除叶子结点每个节点有[(m+1)//2, m]个儿子。内节点(关键码)数比儿子数少1。
插入
在叶子结点处插入,然后向上处理。每次如果当前内节点数量超过限制,就让偏右中间的那个内节点上升,两边分裂,如此递归。只有在根节点处上升时抬高整个树的高度。
删除
如果目标不在叶子节点中,则找到这个点的后继,即挨着这个关键码的右边子树内一直向左走到达的节点的最左关键码,然后交换后继和目标。删除关键码后,节点可能儿子数量小于要求值(自然,数量为下限-1)。分几种情况处理:
- 如果左右兄弟有儿子数比下限多1以上的,让他的挨着这边儿的内节点上升,代替父亲节点中夹着的内节点,被代替的内节点下降,取代要删除的内节点。
- 否则,左右兄弟中一定至少有一个存在且具有下限个儿子。那么让父亲节点中夹着的内节点下降,粘结这个兄弟和自己。合成的节点儿子数必然不超过上限。这样父亲节点可能儿子数量不够,递归处理即可。
外部节点
真的或假的,父亲(至少)有2儿子,自己没有儿子。
红黑树
根黑;外部节点黑;红节点父亲、儿子黑;所有外部结点黑深度相等。
插入
插入成叶子结点。先将自己染红,然后检查自己,如果父亲红则进入修正处理。修正一个节点的条件是自己红且两儿子黑,且父亲红(若存在父亲)。如上所述,外部节点黑,所以新节点自然满足两儿子黑这个条件。修正步骤如下:
- 如果舅舅黑:考察自己、父亲、爷爷的大小关系,让居中的人变黑(自己或父亲),两边的人变红,并变成变黑节点的两个儿子。有些子树要进行自然吸附处理(像splay的rotate里那样)。
- 如果舅舅红:父亲、舅舅变黑,爷爷变红,递归检查爷爷。
- 如果自己已经是根:自己变黑。此时树的黑高度加一。
删除
用经典的BST方法,非叶子节点的删除实际上是用前驱或后继节点替换本节点,然后删除前驱还后继节点。那么实际上删除的节点一定最多有一个儿子。假设没有儿子的那边是黑色(如果两边都没有儿子,那自然也都是黑色)。
- 如果被删除节点和其儿子有一个红(一个黑),那么在自己消失、儿子上升后让儿子染黑色即可。这样满足黑高度要求。
- 如果两节点均黑,则让儿子代替自己(即被删除节点)后进入改造处理。
改造处理一个节点分以下几种情况:
- 自己的兄弟黑且至少有一个红儿子。称这个红儿子(有两个则随便选一个)为团长。又分两种情况:
- 团长、兄弟、父亲在一条线上(zigzig)。这时让这条线上三者的颜色顺次下降一格,将父亲设为黑色。然后rotate兄弟即可。
- zigzag情况。让团长直接获得父亲的颜色,父亲设为黑色。然后rotate两次团长。实际上就是大小居中的人上去。
- 兄弟黑,且没有红儿子(团长——)。此时让兄弟变红,然后看父亲。若父亲红,则变黑。否则递归改造父亲,此时黑高度减少。
- 兄弟红:兄弟变黑,父亲变红,rotate兄弟,然后再改造自己,不会出现递归。
- 自己是根:什么都不做。
以上是关于B树 红黑树的主要内容,如果未能解决你的问题,请参考以下文章