2023年5月3日,周三下午:
今天下午收集够了学习所需的资料和网站,可以开始学习B树了,
我不会一次更新完,因为五一假期要结束了,但是只要有空我就会更新,直到写完这篇博客。
基本概念:
阶
阶是一个节点所能容纳的最大子节点数。如果一个B树是5阶的,那么这意味着这棵B树的每个节点下最多只能有5棵子树:
B树的特点
一棵M阶的B树应具有如下特点:
1、树中每个节点下最多只能有m棵子树。
2、如果根节点不是叶子节点,那么至少要有2棵子树。
3、除了根节点和叶子节点外,其他所有的节点至少要有⌈m/2⌉棵子树
“⌈ ⌉”是向上取整的意思,⌈3.6⌉=4,⌈3.4⌉=4,⌈3.1⌉=4,⌈3⌉=3。注意,向上取整可不是四舍五入,只要小数点右边的数不是0,就得通过加1的方式向上取整。
4、只要不是叶子节点,那么节点就必须包含如下数据:
(n,A0,K1,A1,K2,A2,...,Kn,An)
对,你没看错,没有K0...
n是关键字的个数,n应满足这样的条件:⌈m/2⌉-1<=n<=m-1
K是key的意思,也就是关键字,而且从左往右,K越来越大
A是一个指向子树的根节点的指针,而且Ai所指向的子树中的所有节点的关键字都要大于Ki,小于Ki+1
此外,节点中其实还可以包含指向父节点的指针和指向关键字对应的值(这里的值我想应该是一块比较大的数据)的指针
所以有时你会在B树的节点的定义上看到指向父节点的指针
5、所有的叶子结点都必须在同一层上
现在我来画一个3阶B树,符合上述的所有特点
现在可以给出用C语言实现的B树的节点的定义了
typedef int KeyType; //规定key的数据类型
typedef struct _BTreeNode{
int key_num; //key的数量
KeyType *keys; //key数组
struct _BTreeNode **children; //指向子树的根节点的指针的数组
int leaf; //用来判断是不是叶子节点
}BTreeNode;