B+树算法与源码(C++语言描述) B+树可以看作是B 树的变形,对于存放在外存贮器上的字典,B+树比B 树更为常用。 一个m 阶的B+树满足下列条件∶ (1) 每个结点至多有 m 棵子树。 (2) 除根结点外,其它每个分支至少有 m/2棵子树。 (3) 非叶结点的根结点至少有两棵子树。 (4) 有 n 棵子树的结点有 n 个关键码,叶结点中至少包含 n/2个关键码。 (5) 叶结点都在同一层中,其中存放数据文件中记录的关键码及指向该记录的指针,或存放数据文件分块后每块的最大关键码及指向该块的指针。叶结点按关键码值大小顺序链接。可以把每个叶结点看成是一个基本索引块(直接指向数据文件中的记录)。 (6) 所有分支结点可看成是索引的索引。使结点中仅包含它的各个子结点中最大(或最小)关键码的分界值及指向子结点的指针。 /* * test.cpp * * Created on: 2012-10-10 * Author: charle */ //typedef char* CHARPTR; #include #include using namespace std; #define MAX_CNT 5 #define MIN_CNT 2 typedef struct BTreeNode{ //最大 key 个数为5,最小为2 int key[5];//关键字数组 int nodetype;//节点类型:0-根,1-内部节点,2-外节点 bool isleaf;//是否为叶节点 int nsize;//关键字个数; BTreeNode* succeedingnode[6]; BTreeNode* parentnode; }_BTreeNode; _BTreeNode* Create_BTree(int key) { _BTreeNode *root; root = new _BTreeNode(); root->isleaf = 0; for(int i = 0;i<6;i++) root->succeedingnode[i] = NULL; root->parentnode = NULL; root->nsize = 0; Insert_BTree(root,key); return root; } int middleNode(_BTreeNode* p,int key) { int cnt; int c = p->nsize; int tmp[c + 1]; bool flag = false; int j = c; for(int i = c-1;i>=0 && j>=0;i--) { if(p->key[i]>key) { tmp[j--] = p->key[i]; } else if(p->key[i]<=key && flag == false) { tmp[j--] = key; tmp[j--] = p->key[i]; flag = true; } else { tmp[j--] = p->key[i]; } } return tmp[(c+1)/2]; } _BTreeNode* createNode() { _BTreeNode* p = new _BTreeNode(); return p; } /*** * 查询功能 */ _BTreeNode *selectKey(_BTreeNode *root,int key) { _BTreeNode...