要想理解B+树,必须先知道什么是二叉排序树。
**二叉排序树:**或者是一课空树;或者是具有下列性质的二叉树:
(1)若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;
(2)若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值;
(3)它的左、右子树也分别为二叉排序树。
**平衡二叉树(又称AVL树):**它或者是一课空树,或者是具有下列性质的二叉树:
(1)它的左子树和右子树都是平衡二叉树;
(2)左子树和右子树的深度之差的绝对值不超过1。
**B树(也即B-树,也称平衡多叉查找树):**它或者是一课空树,或者是具有下列性质的二叉树:
(1)树中每个结点至多有m棵子树;
(2)若根节点不是叶子节点,则至少有两棵子树;
(3)除根外的所有非终端结点至少有[m/2]棵子树;
(4)所有的非终端结点中包含下列信息数据
(n,A0,K1,A1,K2,A2,…,Kn,An)
PS:每个节点至多有m-1个关键字,至多有m个儿子节点
**B+树:**棵 m阶的B*树和m阶的B-树的差异在于:
(1)有n棵子树的结点中含有n个关键字。
(2)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
(3)所有的非终端结点可以看成是索引部分,结点中仅含有其子树(根结点)中的最大(或最小)关键字。
了解到这里,我们来具体了解一下对B+树各种操作的算法:
插入算法:
1.首先执行查找算法,找出被插结点的父亲结点。
2.判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。
3.若二叉树为空。则首先单独生成根结点。
注意:新插入的结点总是叶子结点。
对程序的理解:
定义一个B+树的结构体BPlusNode,包含几个成员:
typedef struct BPlusNode *BPlusTree,*Position;
typedef int KeyType;
struct BPlusNode{
int KeyNum; //所含关键字的个数
KeyType Key[M + 1]; //该节点中的关键字,上限为什么是M+1?
BPlusTree Children[M + 1]; //该节点的孩子节点指针,问题同上
BPlusTree Next; //Next是什么?
};
初始化生成一个BPlusNode的节点,就是向内存申请一个这样的空间,并生成指向这个空间的指针NewNode。