
B树、B+树、红黑树
发布日期:2021-05-07 20:08:41
浏览次数:27
分类:精选文章
本文共 1894 字,大约阅读时间需要 6 分钟。
1、B树
B树属于多叉树又名平衡多路查找树(查找路径不只两个)
规则:
(1)排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;(2)子节点数:非叶节点的子节点数>1,且<=M ,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉);
(3)关键字数:枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2);
(4)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子;
最后我们用一个图和一个实际的例子来理解B树(这里为了理解方便我就直接用实际字母的大小来排列C>B>A)
B树的说明:
B树的阶:节点的最多子节点个数。比如2-3树的阶是3,2-3-4树的阶是4- B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点
- 关键字集合分布在整颗树中, 即叶子节点和非叶子节点都存放数据.
- 搜索有可能在非叶子结点结束
- 其搜索性能等价于在关键字全集内做一次二分查找
2、B+树
B+树是B树的变体,也是一种多路搜索树。
B+树的说明:
- B+树的搜索与B树也基本相同,区别是B+树只有达到叶子结点才命中(B树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找
- 所有关键字都出现在叶子结点的链表中(即数据只能在叶子节点【也叫稠密索引】),且链表中的关键字(数据)恰好是有序的。不可能在非叶子结点命中
- 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层,更适合文件索引系统
3、B树和B+树的区别
B+树:
- B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;
- B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;
- B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。
B树:
- 关键字集合分布在整颗树中, 即叶子节点和非叶子节点都存放数据。
- 搜索有可能在非叶子结点结束
优缺点:
- B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;
- B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;
- B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
- B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。
B树相对于B+树的优点是,如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字其数据的地址,所以这种数据检索的时候会要比B+树快。
3、 R-B Tree(红黑树)
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
红黑树的特性:
- 每个节点或者是黑色,或者是红色。
- 根节点是黑色。
- 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
- 如果一个节点是红色的,则它的子节点必须是黑色的。
- 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
注意:
- 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
- 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接**衡的二叉树。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月10日 20时58分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
flink —— checkpoint机制
2019-03-05
shell脚本中冒泡排序、直接排序、反转排序
2019-03-05
WPS及Excel中Alt键的妙用 快捷键
2019-03-05
C - 食物链 并查集
2019-03-05
Pycharm 常用快捷键
2019-03-05
基于Altium Designer的电子设计的入门指南
2019-03-05
基于LabVIEW的入门指南
2019-03-05
PCB布局系列汇总
2019-03-05
电阻入门知识
2019-03-05
电容入门知识
2019-03-05
C++面向对象
2019-03-05
正则表达式教程
2019-03-05
专题(七)贪心——AcWing 112. 雷达设备
2019-03-05
深入理解JVM(一)JVM概述、类的声明周期、JVM整体架构、JMM、volatile
2019-03-05
【Java】寻找数组中“主要元素”
2019-03-05
达梦数据库主备部署
2019-03-05
P1455 搭配购买(并查集+dp)
2019-03-05
P3367 【模板】并查集(并查集)
2019-03-05
线段树练习题一(离散化)
2019-03-05