B-树(B-Tree)的C++演示代码
按照算法导论中伪代码转化,其中删除过程算法导论没有给出伪代码,所以对删除相关函数做了说明。另外B-Tree本来是用于硬盘的,但为了简便只阐明B-Tree的基本流程,没有加入硬盘扇区的直接读写操作,全部在内存中进行。
1.头文件(B-Tree.h)
#ifndef BTREE__JOHN__DMRC
#define BTREE__JOHN__DMRC
/*************************** Class BTreeNode ***************************/
template <typename T>
class BTreeNode{
public:
BTreeNode(int, bool);
~BTreeNode();
// Varies
int t;
int len;
bool leaf;
T* key;
BTreeNode<T>** child;
};
/**************************** Class BTree ******************************/
template <typename T>
class BTree{
public:
BTree(int);
~BTree();
bool BTree_Search(T);
void BTree_Insert(T);
bool BTree_Delete(T);
// debug start
void print_root();
// debug end
private:
bool btree_search(BTreeNode<T>*, T);
void delete_tree(BTreeNode<T>*);
void btree_split_child(BTreeNode<T>*, int, BTreeNode<T>*);
void btree_insert_nonfull(BTreeNode<T>*, T);
void btree_merge_child(BTreeNode<T>*, int);
void btree_rotate_child(BTreeNode<T>*, int, bool);
bool btree_delete_nonfew(BTreeNode<T>*, T);
BTreeNode<T>* root;
int t;
};
#endif
2 cpp文件(B-Tree.cpp)
#include "B-Tree.h"
/*************************** Class BTreeNode ***************************/
template <typename T>
BTreeNode<T>::BTreeNode(int a, bool b){
this ->t = a;
this ->len = 0;
this ->leaf = b;
this ->key = new int[2 * a - 1];
this ->child = new BTreeNode*[2 * a];
}
template <typename T>
BTreeNode<T>::~BTreeNode(){
delete [] this ->key;
delete [] this ->child;
}
/**************************** Class BTree ******************************/
// C & D
template <typename T>
BTree<T>::BTree(int a){
this ->t = a;
this ->root = new BTreeNode<T>(a, true);
}
template <typename T>
BTree<T>::~BTree(){
this ->delete_tree(this ->root);
}
template <typename T>
void BTr