- 每个节点中子节点的个数不超过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步
- 5). 若兄弟节点有富余
- 父节点key下移,兄弟节点key上移,删除结束
- 否则执行第6步
- 6). 当前节点和兄弟节点及父节点下移合并成一个新的节点
- 将当前节点指向父节点,重复第4步
- 1). 删除叶子节点中对应的key。