B树是一种适合外查找的树,是一种平衡 的多叉树。
一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足一下性质:
1。根节点至少有两个孩子
2。每个非根节点有[M/2,M]个孩子
3。每个非根节点有[M/2-1,M-1]个关键字,并且以升序排列
4。每个节点孩子的数量比关键字的数量多一个。
5。 key[i]和key[i+1]之间的孩子节点的值介于key[i]、key[i+1]之间
6。 所有的叶子节点都在同一层
下面用代码来实现一下B树
#pragma once
template<class K, class V, size_t M>
struct BTreeNode
{
pair<K, V> _kvs[M]; // 多开一个空间,方便分裂
BTreeNode<K, V, M>* _subs[M+1];
BTreeNode<K, V, M>* _parent;
size_t _size; // 关键字的数量
BTreeNode()
:_parent(NULL)
,_size(0)
{
for (size_t i = 0; i < M+1; ++i)
{
_subs[i] = NULL;
}
}
};
template<class K, class V, size_t M>
class BTree
{
typedef BTreeNode<K, V, M> Node;
public:
BTree()
:_root(NULL)
{}
pair<Node*, int> Find(const K& key)
{
Node* parent = NULL;
Node* cur = _root;
while (cur)
{
size_t i = 0;
while(i < cur->_size)