Folders and files Name Name Last commit message
Last commit date
parent directory
View all files
每个节点中子节点的个数不超过m,也不能小于m/2
根节点的子节点个数可以不超过m/2
m叉树只存储索引,并不真正存储数据,这个类似于跳表
通过链表将叶子节点串联在一起,这样可以方便查找
一般情况,根节点会被存储在内存中,其他节点存储在磁盘中
B+树中的节点不存储数据,只是索引,而B树中的节点存储数据
B树的叶子节点并不需要链表来串联
1). 若为空树,创建一个叶子节点,然后将记录插入其中,此时这个叶子也是根节点,插入操作结束
2). 针对叶子类型节点
更具key值找到叶子节点,向这个叶子节点插入记录
插入后,若当前节点key的个数小于等于 m - 1,则插入结束
否则将这个叶子节点分裂成左右两个叶子节点,左叶子节点包含前 m / 2个记录,右节点包含剩下的记录,将第 m / 2 + 1个记录的key进位到父节点中(父节点一定是索引类型节点),进位到父节点的key左孩子指针向左节点,右孩子指向右节点
将当前节点的指针指向父节点,然后执行第3步
3). 针对索引类型
若当前节点key的个数小于等于 m - 1, 则插入结束
否则,将这个索引类型节点分裂成两个索引节点,左索引节点包含前(m - 1) / 2个key,右节点包含 m - (m - 1) / 2 个key,将第 m / 2 个key进位到父节点,进位到父节点的key左孩子指向左节点,进位到父节点的key右孩子指向右节点
将当前节点的指针指向父节点,重复第3步
如果叶子节点中没有相应的key,则删除失败
否则执行下面的步骤
1). 删除叶子节点中对应的key。
删除后若节点的key个数大于等于ceil(m - 1) / 2 - 1, 则删除结束
否则执行第2步
2). 若兄弟节点key有富余(大于 ceil(m - 1) / 2 - 1)
向兄弟节点借一个记录,同时用借到的key替换父节点(指当前节点和兄弟节点共同的父节点)中的key,删除结束
否则执行第3步
3). 若兄弟节点中没有富余的key
则当前节点和兄弟节点合并成一个新的叶子节点,并删除父节点中的key(父节点中的这个key两边的孩子指针就变成了一个指针,正好指向这个新的叶子节点)
将当前节点指向父节点(必为索引点),执行第4步
4). 若索引节点的key的个数大于等于ceil(m - 1) / 2 - 1
5). 若兄弟节点有富余
父节点key下移,兄弟节点key上移,删除结束
否则执行第6步
6). 当前节点和兄弟节点及父节点下移合并成一个新的节点
You can’t perform that action at this time.