b树的原理介绍:
https://blog.csdn.net/u013411246/article/details/81088914
b树的代码实现
#include <iostream>
#include <time.h>
using namespace std;
//定义b树的阶数
const int m = 4;
template<typename T>
struct BTNode
{
BTNode<T>():keyNum(0),key(new T[m+1]),parent(nullptr)
{
ptr = new BTNode*[m+2];
for(int i = 0; i < m+2; i++)
{
ptr[i] = nullptr;
}
}
~BTNode<T>()
{
delete []key;
delete []ptr;
}
int keyNum; //当前的元素个数
T *key;
BTNode **ptr; //指向子节点
BTNode *parent; //指向父节点
};
template<typename T>
class CBtree
{
public:
CBtree()
{
mThead = new BTNode<T>();
}
~CBtree()
{
delete mThead;
}
//插入时调整树的状态
void AdjustInsert(BTNode<T> &pTmp);
//插入数据
void insertVal(BTNode<T> &pTmp, T val);
//删除时的调整树状态
void AdjustDelete(BTNode<T> &pTmp);
//B树的删除操作
void deleteVal(BTNode<T> &pTmp, T val);
//删除时合并两个节点
void mergeNode(BTNode<T> &left,int i);
//B树的查找
BTNode<T> *query(BTNode<T> &pTmp, T val);
//打印B树 中序打印,即按顺序打印
void Show(BTNode<T> &pTmp);
//返回B树的头节点
BTNode<T> * getHead() {
return mThead; }
private:
BTNode<T> *mThead;
};
template<typename T>
BTNode<T> *CBtree<T>::query(BTNode<T> &pTmp, T val)
{
BTNode<T> *p = &pTmp;
while(p != nullptr)
{
int i = 0;
for(; i < p->keyNum; i++)
{
if(val == p->key[i])
{
return p;
}
else if(val < p->key[i])
{