数据结构与算法11--红黑树

红黑树

  • 红黑树也是一种自平衡的二叉搜索树;
  • 红黑树以前也叫做平衡二叉B树;

如下图所示:

Snip20210511_15.png

红黑树的5条性质:

  1. 节点是RED或者BLACK;
  2. 根节点是BLACK;
  3. 叶子节点(空节点)都是BLACK;
  4. RED节点的子节点都是BLACK;
    4.1 RED节点的parent都是BLACK;
    4.2 从根节点到叶子节点的所有路径上不能有2个连续的RED节点;
  5. 从任意节点到叶子节点的所有路径都包含相同数目的BLACK节点;

B树

  • B树是一种平衡的多路搜索树,多用于文件系统,数据库的实现;
  • 一个节点可以存储超过2个元素,可以拥有超过2个字节点;
  • 拥有二叉搜索树的性质;
  • 平衡,每个节点的所有子树高度一致;
  • 比较矮;

m阶B树的性质(m>=2)

  • m阶B树是指一个节点最多拥有m个子节点;
Snip20210511_16.png
Snip20210511_17.png
  • 假设一个节点存储的元素个数为x
    • 根节点: 1 <= x <= m - 1
    • 非根节点: ceil(m/2) - 1 <= x <= m -1
  • 如果有子节点,子节点的个数 y = x + 1;
    • 根节点的子节点:2 <= y <= m
    • 非根节点的子节点: ceil(m/2) <= y <= m

以m=3,即3阶B树为例:

  • 根节点的元素个数 1<= x <= 2,即1或者2,不会有3个元素;

  • 非根节点的元素个数 1<= x <= 2,即1或者2,不会有3个元素;

  • 根节点的子节点个数 2 <= y <= 3

  • 非根节点的子节点个数 2 <= y <= 3

  • B树与二叉搜索树,在逻辑上等价的;

  • 多代节点合并,可以获得一个超级节点;

  • 2代合并的超级节点,最多拥有4个子节点,至少是4阶B树;

  • 3代合并的超级节点,最多拥有8个子节点,至少是8阶B树;

  • n代合并的超级节点,最多拥有 2^n 个子节点,至少是 2^n 阶B树;

  • m阶B树,最多需要log2 m带合并;

搜索指定节点

  • 从根节点开始;
  • 先在节点内部从小到大开始搜索元素;
  • 如果命中,搜索结束;
  • 如果未命中,再去对应的子节点中搜索元素,重复步骤1;

添加

  • 新添加的元素必定是添加到叶子节点;

添加导致上溢

  • 上溢节点的元素个数必然等于m;
  • 假设上溢节点最中间的元素的位置为k;
  • 将k位置的元素向上与父节点合并;
  • 将[0,k-1]和[k+1,m-1]位置的元素分裂成2个子节点,这两个子节点的元素个数,必然都不会低于最低限制ceil(m/2)-1;
  • 一次分裂完成后,有可能导致父节点上溢,依然按照上述的方法解决;
  • 最极端的情况,有可能一直分裂到根节点;

如下所示:4阶B树,添加元素98

Snip20210511_18.png
Snip20210511_19.png
  • 添加元素98,由于是4阶B树,节点元素个数最大为3,则导致上溢;需进行一次分裂结果如下:
Snip20210511_20.png

删除叶子节点

  • 需要删除的元素在叶子节点中,那么直接删除即可;

如下所示:删除元素55


Snip20210511_18.png
  • 删除元素55之后:
Snip20210511_21.png

删除非叶子节点

  • 先找到其前驱或者后继元素,覆盖所需删除元素的值;
  • 再把前驱或后继元素删除;

如下所示:删除元素60

Snip20210511_22.png
Snip20210511_23.png
  • 真正被删除的元素是前继元素55,
  • 真正被删除的元素都是在叶子节点中。

删除导致下溢

原理如下所示:

Snip20210517_2.png

看一个例子:5阶B树删除元素22

Snip20210511_24.png
  • 删除元素22,由上面的结论我们知道非根节点的元素数量 ceil(5/2)-1<= x <= 4,即至少有两个元素,现在删除22,导致当前节点的元素为1,即导致下溢;
  • 下溢节点的元素数量必然等于ceil(m/2) - 2
  • 如果下溢节点临近的兄弟节点至少有ceil(m/2)个元素,可以向其借一个元素;
  • 将父节点的元素b插入到下溢节点的最小位置;
  • 用兄弟节点的元素a(最大元素)替代父节点的元素b;
  • 上述操作的本质就是:旋转,操作结果如下所示:
Snip20210517_1.png
  • 如果下溢节点的临近兄弟节点,只有ceil(m/2)-1个元素;
  • 将父节点的元素b挪下来与左右子节点进行合并;
  • 合并之后的节点元素个数为ceil(m/2)+ceil(m/2)-2,不会超过m-1;原理如下图所示:
Snip20210517_3.png
  • 此操作可能会导致父节点下溢,依然按照上述的方法解决,下溢现象可能会一直向上传播;

红黑树的等价变换

  • 红黑树与4阶B树具有等价性;
  • BLACK节点与它的RED子节点融合在一起,形成一个B树节点;
  • 红黑树的BLACK节点个数与4阶B树的节点总个数相等;
Snip20210519_17.png

红黑树的添加

  • 新元素的必定是添加到叶子节点中;
  • 4阶B树所有节点的元素个数x都满足 【1,3】;
  • 建议新添加的节点默认为红色RED;
  • 如果添加的是根节点,染成黑色BLACK即可;

以上面的红黑树为例子,进行阐述添加的所有情况:

  1. 当添加的节点的父节点parent为黑色BLACK,如下图所示:
Snip20210519_18.png
  • 具体有4种情况,见图中被添加的粉色节点;
  • 能同时满足红黑树的五条性质,因此不用做任何额外的处理;
  1. 当添加的节点的父节点parent为红色RED,如下图所示:
Snip20210519_19.png
  • 具体有8种情况,见图中被添加的粉色节点;
  • 不满足红黑树的第4条性质:RED节点的子节点都是BLACK;
添加 - 修复性质4 -- LL/RR
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,332评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,930评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,204评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,348评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,356评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,447评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,862评论 3 394
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,516评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,710评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,518评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,582评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,295评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,848评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,881评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,121评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,737评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,280评论 2 341

推荐阅读更多精彩内容