数据结构与算法之B树,红黑树

1.引言

数据结构与算法这本书的树这张真的是本书的难点之一,很烧脑,看书看几遍都不懂。无奈只有看看博客,记下笔记理解下。B-树主要应用在数据库和文件系统的读写方面。一个程序的执行严重耗时的不是复杂的计算而是访问io的次数。平衡二叉树可以使时间复杂度低于log^n。这样就可以大大减少文件读写的

2.正题

B-树:多叉的平衡二叉树。

Paste_Image.png

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

B-树的是这样定义的(假设阶数是M):
1:树中每个结点最多含有m个子节点(m>=2)。
2:每个内节点至少 [ceil(m / 2)] 个子节点。 内节点即非根节点非页子节点,也可以叫中间节点。
3: 关键字key的数量 [ceil(m / 2)-1]<= n <= m-1,关键字按递增排序。
4: 每个叶节点具有相同的深度,即树的高度h,而且不包含关键字信息。

Paste_Image.png

B-树的作用:运用于大块数据的读写,常用于数据库和文件系统。

B-树的插入规则:B树的非根节点的关键字的个数K是:
M-1<=K<=2M-1。当节点的关键字==2M-1,表示插满了,此时再继续插的话就需要进行。分裂操作、

demo
阶数为3:那么每个节点的关键字K:1<=k<=2
下面我们来举例说明,首先假设这个B-树的阶为:3。树的初始化时如下:

这里写图片描述

首先,我需要插入一个关键字:30,可以得到如下的结果:
这里写图片描述

再插入26,得到如下的结果:
这里写图片描述

OK,此时如图所示,在插入的那个终端结点中,它的关键字数已经超过了m-1=2,所以我们需要对结点进分裂,所以我们先对关键字排序,得到:26 30 37 ,所以它的左部分为(不包括中间值):26,中间值为:30,右部为:37,左部放在原来的结点,右部放入新的结点,而中间值则插入到父结点,并且父结点会产生一个新的指针,指向新的结点的位置,如下图所示:
这里写图片描述

OK,然后我们继续插入新的关键字:85,得到如下图结果:
这里写图片描述

正如图所示,我需要对刚才插入的那个结点进行“分裂”操作,操作方式和之前的一样,得到的结果如下:
这里写图片描述

哦,当我们分裂完后,突然发现之前的那个结点的父亲结点的度为4了,说明它的关键字数超过了m-1,所以需要对其父结点进行“分裂”操作,得到如下的结果:
这里写图片描述

好,我们继续插入一个新的关键字:7,得到如下结果:
这里写图片描述

同样,需要对新的结点进行分裂操作,得到如下的结果:
这里写图片描述
到了这里,我就需要继续对我们的父亲结点进行分裂操作,因为它的关键字数超过了:m-1.
这里写图片描述

哦,终于遇到这种情况了,我们的根结点出现了关键子数量超过m-1的情况了,这个时候我们需要对父亲结点进行分列操作,但是根结点没父亲啊,所以我们需要重新创建根结点了。
这里写图片描述

好了,到了这里我们也知道怎么进行B-树的插入操作。

3.红黑树

参考文献:红黑树(一)之 原理和算法详细介绍

应用
红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。例如,Java集合中的TreeSetTreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

图红黑树:

Paste_Image.png

时间复杂度: O(lgn)

为 了达到平衡二叉树,要对树进行旋转,以前不理解这个旋转,现在突然能理解了。

1. 左旋

Paste_Image.png

左旋:就是将左旋的节点当作其右子节点的左节点,然后再调整子节点

理解左旋之后,看看下面一个更鲜明的例子。你可以先不看右边的结果,自己尝试一下。

Paste_Image.png

右旋

Paste_Image.png

理解右旋之后,看看下面一个更鲜明的例子。你可以先不看右边的结果,自己尝试一下。


Paste_Image.png

综合例子个人觉得很有教学意义的demo:
将这棵树旋转得到平衡二叉树:

Paste_Image.png

第一步:右旋节点为30的节点
第二步:左旋节点为20的节点


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

推荐阅读更多精彩内容