1.B-树的缺陷:
按照顺序去遍历所有的节点,但是B-树实现按照顺序去遍历所有的节点话,指针会在各个节点间反复跳跃,效率比较低,这就引出了B+树
查找某个范围内的所有节点,效率比较低


B-树和B+树差异:
- B+树的叶子节点层通过链表从左至右连接起来了(注意:图上看着像是单链表,其实底层是双向链表)
- B+树的叶子节点层包含了所有的有效元素,而且其他层节点层只是作为索引层来存在(其他层当做快捷方式即可)
- B-树的所有元素只会出现一次,而B+树元素有可能出现多次
- 总结,所以查找一个值的话,B+树只需要从叶子节点层最左侧的节点出发,然后依次对所有 的元素进行遍历即可
B+树的概念和性质:
- B+树的叶子节点层包含了所有的元素及其指向其存储在磁盘中的记录指针,非叶子节点层作为索引存在

- M阶B+树指的是节点的分支个数上限是M个,且元素上限也是M个
- B+树在我们的顺序遍历和随机查找以及范围查找方面很厉害
B+树的有效节点设计:
cpp
#pragma once
#define M 5
typedef int ElemType;
//磁盘中的记录写一个泛型
//记录集结构体
typedef struct {}Record;
typedef enum{LEAF,BRANCH}NodeType;
//B+树的有效节点结构体设计
typedef struct BPlusNode {
int key_num;//1.当前节点的有效元素个数
ElemType key_arr[M + 1];//2.一个存储若干个有效元素的数组
struct BPlusNode* ptr_arr[M + 1];//3.一个存储若干个指向其孩子节点的指针数组
struct BPlusNode* parent;//4.双亲指针
Record*recptr[M + 1];//5.存储每一个元素所对应的在磁盘上的记录的指针数组
NodeType type;//1.标签,表示当前节点是叶子节点还是非叶子节点
struct BPlusNode* prev;//2.前驱指针
struct BPlusNode* next;//3.后继指针
}BPlusNode;
//B+树的辅助节点结构体设计
typedef struct BPlusTree {
BPlusNode* root;//指向根节点
BPlusNode* first;//指向最小的叶叶节点
};
//查找函数返回值结构体单独设计一下
typedef struct Result {
bool tag;
BPlusNode* pNode;
int index;
}Result;