对比B树
B+树对比B树主要有两点区别,分别是
- 内部节点(非叶子节点)更新为索引节点,索引当时不放数据,将数据放置到叶子节点
 - 叶子节点直接指向下一个叶子节点,如果需要进行in查询或者连续遍历,相比B树有更大的优点
 
性质
- B+树与B树最大的不同是内部结点不保存数据,只用于索引,所有数据(或者说记录)都保存在叶子结点中。
 - 每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接。
 
演示地址
图

结构
相比B树增加了一个next节点,叶子节点指向下一个叶子节点
private final class Node {public int numberOfNodes = 0;/*** the array that holds the keys value.*/public int key[];/*** 父亲节点*/public Node parent;/*** the array that holds the references of the keys in the node.*/public Node children[];//next指针public Node next;}
全部代码
插入
B+树的数据插入一定发生在树的叶子节点,如果叶子节点不满足性质,则递归的向上处理,分裂。
- 找到待插入的叶子节点 (叶子节点元素的个数<=m-1)
 - 插入数据后,如果节点元素的个数<=m-1,直接返回,插入结束。否则进行第三步
 - 以节点中间key作为间限,分裂为2个子树,key的前半部分为左子树Left,key的后半部分为右子树Right,key元素成为父节点元素数据的一部分,孩子分别指向Left和Right。由于key元素上移,parent成为新插入节点,递归执行第二步。
- 新分裂的左右节点的parent指向新产生的parent节点
 - 新分裂的左右节点的children指向node的children节点
 
 
—— 这部分都满足B树的处理方式
- 分裂后需要额外处理next指向,额外处理索引节点和叶子节点的信息
核心的节点分裂,如果分裂后导致元素上移的parent节点满了,继续分裂parent节点 语雀展现长代码块有Bug,查看代码的可以到Github上查看
 
删除
[m/2]=m/2向上取整; [5/2] = 3; [3/1]=2;
- 富裕节点: 节点的元素个数 >= [m/2]-1 ;
 
同B树删除方式,需额外处理next和节点信息
B 🌲【B Tree】
遍历
https://stackoverflow.com/questions/5890960/print-btree-by-level
同B树遍历方式
