b树的实现
main.cpp
#include <iostream>
#include <string>
#include "main.h"
#define BTREE_TEST
using std::string;
int main()
{
#ifdef BTREE_TEST
bTree<int> obj(5);
obj.insertTree(70, 70);
obj.insertTree(40, 40);
obj.insertTree(80, 80);
obj.insertTree(30, 30);
obj.insertTree(50, 50);
obj.insertTree(100, 100);
obj.insertTree(110, 110);
obj.insertTree(300, 300);
obj.insertTree(120, 120);
obj.insertTree(60, 60);
obj.insertTree(130, 130);
obj.insertTree(20, 20);
obj.insertTree(310, 310);
obj.insertTree(10, 10);
obj.insertTree(11, 11);
obj.insertTree(90, 90);
obj.insertTree(91, 91);
obj.insertTree(41, 41);
obj.insertTree(42, 42);
obj.insertTree(43, 43);
obj.insertTree(44, 44);
obj.insertTree(45, 45);
obj.insertTree(46, 46);
obj.insertTree(12, 12);
obj.insertTree(13, 13);
obj.insertTree(14, 14);
obj.insertTree(15, 15);
obj.insertTree(16, 16);
obj.insertTree(17, 17);
obj.insertTree(31, 31);
obj.insertTree(32, 32);
obj.insertTree(33, 33);
obj.insertTree(34, 34);
obj.insertTree(35, 35);
obj.insertTree(36, 36);
#endif
return(0);
}
main.h
#ifndef __MAIN_H__
#define __MAIN_H__
#include <vector>
using std::vector;
#include "heap.h"
#include "heapSort.h"
#include "indexMinPriorityQueue.h"
#include "biTriTree.h"
#include "redBlackBT.h"
#include "bTree.h"
#endif
bTree.h
#ifndef __BTREE_H__
#define __BTREE_H__
#include "main.h"
template <typename T>
struct kv{
int key;
T val;
};
template <typename T>
class BNodeSet{
public:
BNodeSet(){ };
BNodeSet(int m);
int MNum;
int keyNum;
void insVK2NS(int k, T v);
void insChild2NS(BNodeSet<T>* x, BNodeSet<T>* x1,
BNodeSet<T>* y);
vector<BNodeSet<T>*> childSetP;
vector<kv<T>> kvArr;
};
template <typename T>
BNodeSet<T>::BNodeSet(int m){
MNum = m;
keyNum = 0;
kvArr.resize(m);
for(int i=0; i < m; i++){
(kvArr[i]).key = -1;
(kvArr[i]).val = T();
}
childSetP.resize(m+1);
for(int i=0; i < m+1; i++){
childSetP[i] = new BNodeSet<T>;
childSetP[i] = 0;
}
}
template <typename T>
void BNodeSet<T>::insVK2NS(int k, T v){
queue<kv<T>> que;
bool flag = false;
kv<T> tmp;
tmp.key = k;
tmp.val = v;
if(keyNum == 0){
kvArr[0] = tmp;
++(keyNum);
return;
}
for(int i=0; i < keyNum; i++){
if(k == (kvArr[i]).key){
kvArr[i] = tmp;
return;
}
if(k > kvArr[keyNum-1].key){
kvArr[keyNum] = tmp;
keyNum++;
return;
}
if((k < (kvArr[i]).key) && (flag == false)){
flag = true;
que.push(tmp);
que.push(kvArr[i]);
}else{
que.push(kvArr[i]);
}
}
++(keyNum);
int i = 0;
while(!que.empty()){
kvArr[i] = que.front();
que.pop();
i++;
}
}
template <typename T>
void BNodeSet<T>::insChild2NS(BNodeSet<T>* x,
BNodeSet<T>* x1, BNodeSet<T>* y){
queue<BNodeSet<T>*> que;
bool flag = false;
for(int i=0; i < x->keyNum; i++){
if((flag == false) && (x->childSetP[i] == x1)){
flag = true;
que.push(x->childSetP[i]);
que.push(y);
}else{
que.push(x->childSetP[i]);
}
}
int i = 0;
while(!que.empty()){
x->childSetP[i] = que.front();
que.pop();
i++;
}
}
template <typename T>
class bTree{
public:
bTree(int m){
M = m;
rootTree = 0;
}
void insertTree(int k, T val);
private:
void insertTree(BNodeSet<T>* r,BNodeSet<T>* pre,
int k, T val);
bool isOF(BNodeSet<T>* x);
void split(BNodeSet<T>* r, BNodeSet<T>* pre);
int M;
BNodeSet<T>* rootTree;
};
template <typename T>
bool bTree<T>::isOF(BNodeSet<T>* x){
return((x->keyNum) == (x->MNum));
}
template <typename T>
void bTree<T>::insertTree(int k, T val){
insertTree(rootTree, 0, k, val);
}
template <typename T>
void bTree<T>::insertTree(BNodeSet<T>* sonSet,
BNodeSet<T>* dadSet,
int k, T v){
if(rootTree == 0){
rootTree = new BNodeSet<T>(M);
rootTree->insVK2NS(k, v);
return;
}
if(sonSet->childSetP[0] == 0){
sonSet->insVK2NS(k, v);
if(sonSet->keyNum == sonSet->MNum){
split(sonSet, dadSet);
}
return;
}
for(int i=0; i < sonSet->keyNum; i++){
if(k == (sonSet->kvArr[i]).key){
(sonSet->kvArr[i]).val = v;
return;
}
if(k < (sonSet->kvArr[i]).key){
insertTree(sonSet->childSetP[i],sonSet,
k, v);
break;
}
if(i == (sonSet->keyNum - 1)){
insertTree(sonSet->childSetP[sonSet->keyNum],
sonSet,k, v);
break;
}
}
if(((sonSet != 0) && isOF(sonSet)) ||
((dadSet == 0) && isOF(sonSet))){
split(sonSet, dadSet);
}
return;
}
template <typename T>
void bTree<T>::split(BNodeSet<T>* sonSet,
BNodeSet<T>* dadSet){
int midIndex = (M-1)/2;
BNodeSet<T>* newNodeSet = new BNodeSet<T>(M);
int j = 0;
for(j=0; j < midIndex; j++){
newNodeSet->kvArr[j].key =
sonSet->kvArr[midIndex+j+1].key;
newNodeSet->kvArr[j].val =
sonSet->kvArr[midIndex+j+1].val;
sonSet->kvArr[midIndex+j+1].key = -1;
sonSet->kvArr[midIndex+j+1].val = T ();
newNodeSet->childSetP[j] =
sonSet->childSetP[midIndex+j+1];
sonSet->childSetP[midIndex+j+1] = 0;
++(newNodeSet->keyNum);
--(sonSet->keyNum);
}
newNodeSet->childSetP[newNodeSet->keyNum] =
sonSet->childSetP[midIndex+j+1];
sonSet->childSetP[midIndex+j+1] = 0;
if(dadSet == 0){
dadSet = new BNodeSet<T>(sonSet->MNum);
dadSet->insVK2NS(sonSet->kvArr[midIndex].key,
sonSet->kvArr[midIndex].val);
sonSet->kvArr[midIndex].key = -1;
sonSet->kvArr[midIndex].val = T();
--(sonSet->keyNum);
dadSet->childSetP[0] = sonSet;
dadSet->childSetP[1] = newNodeSet;
rootTree = dadSet;
}else{
dadSet->insVK2NS(sonSet->kvArr[midIndex].key,
sonSet->kvArr[midIndex].val);
sonSet->kvArr[midIndex].key = -1;
sonSet->kvArr[midIndex].val = T();
--(sonSet->keyNum);
dadSet->insChild2NS(dadSet, sonSet, newNodeSet);
}
}
#endif
```cpp