no message
parent
4c10d2ed2d
commit
d30ab7f6ed
|
@ -1,5 +0,0 @@
|
|||
//
|
||||
// Created by 29019 on 2020/5/6.
|
||||
//
|
||||
|
||||
#include "btree.h"
|
|
@ -1,14 +0,0 @@
|
|||
//
|
||||
// Created by 29019 on 2020/5/6.
|
||||
//
|
||||
|
||||
#ifndef GENERAL_BTREE_H
|
||||
#define GENERAL_BTREE_H
|
||||
|
||||
|
||||
class btree {
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif //GENERAL_BTREE_H
|
|
@ -0,0 +1,206 @@
|
|||
//
|
||||
// Created by 29019 on 2020/5/6.
|
||||
//
|
||||
|
||||
#ifndef GENERAL_BTREE_H
|
||||
#define GENERAL_BTREE_H
|
||||
|
||||
template<class K, int M = 3>
|
||||
struct BTreeNode
|
||||
{
|
||||
K _keys[M]; // 关键字数组
|
||||
BTreeNode<K, M>* _subs[M + 1]; // 孩子数组
|
||||
size_t _size; // 关键字的个数
|
||||
|
||||
BTreeNode<K, M>* _parent; // 父亲
|
||||
|
||||
BTreeNode()
|
||||
:_size(0)
|
||||
, _parent(NULL)
|
||||
{
|
||||
for (size_t i = 0; i < M + 1; ++i)
|
||||
{
|
||||
_subs[i] = NULL;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template<class K, class V>
|
||||
struct Pair
|
||||
{
|
||||
K _first;
|
||||
V _second;
|
||||
|
||||
Pair(const K& k = K(), const V& v = V())
|
||||
:_first(k)
|
||||
, _second(v)
|
||||
{}
|
||||
};
|
||||
|
||||
template<class K, int M = 3>
|
||||
class BTree
|
||||
{
|
||||
typedef BTreeNode<K, M> Node;
|
||||
public:
|
||||
BTree()
|
||||
:_root(NULL)
|
||||
{}
|
||||
|
||||
Pair<Node*, int> Find(const K& key)
|
||||
{
|
||||
Node* parent = NULL;
|
||||
Node* cur = _root;
|
||||
while (cur)
|
||||
{
|
||||
int i = 0;
|
||||
while (i < cur->_size && cur->_keys[i] < key)
|
||||
{
|
||||
++i;
|
||||
}
|
||||
|
||||
if (cur->_keys[i] == key)
|
||||
{
|
||||
return Pair<Node*, int>(cur, i);
|
||||
}
|
||||
|
||||
parent = cur;
|
||||
cur = cur->_subs[i];
|
||||
}
|
||||
|
||||
return Pair<Node*, int>(parent, -1);
|
||||
}
|
||||
|
||||
bool Insert(const K& key)
|
||||
{
|
||||
if (_root == NULL)
|
||||
{
|
||||
_root = new Node;
|
||||
_root->_keys[0] = key;
|
||||
++_root->_size;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Pair<Node*, int> ret = Find(key);
|
||||
if (ret._second != -1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
K k = key;
|
||||
Node* cur = ret._first;
|
||||
Node* sub = NULL;
|
||||
|
||||
// 在cur节点插入一个k
|
||||
while (1)
|
||||
{
|
||||
_InsertKey(cur, k, sub);
|
||||
if (cur->_size < M)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// 分裂
|
||||
int boundary = M / 2;
|
||||
|
||||
Node* tmp = new Node;
|
||||
size_t index = 0;
|
||||
size_t size = cur->_size;
|
||||
|
||||
// 拷贝key
|
||||
for (int i = boundary + 1; i < size; ++i)
|
||||
{
|
||||
tmp->_keys[index++] = cur->_keys[i];
|
||||
tmp->_size++;
|
||||
cur->_size--;
|
||||
}
|
||||
// 拷贝子节点
|
||||
index = 0;
|
||||
for (int i = boundary + 1; i <= size; ++i)
|
||||
{
|
||||
tmp->_subs[index] = cur->_subs[i];
|
||||
if (tmp->_subs[index])
|
||||
tmp->_subs[index]->_parent = tmp;
|
||||
|
||||
++index;
|
||||
}
|
||||
|
||||
k = cur->_keys[boundary];
|
||||
cur->_size--;
|
||||
|
||||
// 没有父亲
|
||||
if (cur->_parent == NULL)
|
||||
{
|
||||
_root = new Node;
|
||||
_root->_keys[0] = k;
|
||||
_root->_subs[0] = cur;
|
||||
_root->_subs[1] = tmp;
|
||||
_root->_size = 1;
|
||||
|
||||
tmp->_parent = _root;
|
||||
cur->_parent = _root;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
cur = cur->_parent;
|
||||
sub = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
void _InsertKey(Node* cur, const K& k, Node* sub)
|
||||
{
|
||||
int i = cur->_size - 1;
|
||||
while (i >= 0)
|
||||
{
|
||||
if (cur->_keys[i] > k)
|
||||
{
|
||||
cur->_keys[i + 1] = cur->_keys[i];
|
||||
cur->_subs[i + 2] = cur->_subs[i + 1];
|
||||
|
||||
--i;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cur->_keys[i + 1] = k;
|
||||
cur->_subs[i + 2] = sub;
|
||||
if (sub)
|
||||
{
|
||||
sub->_parent = cur;
|
||||
}
|
||||
|
||||
cur->_size++;
|
||||
}
|
||||
|
||||
void InOrder()
|
||||
{
|
||||
_InOrder(_root);
|
||||
cout << endl;
|
||||
}
|
||||
|
||||
void _InOrder(Node* root)
|
||||
{
|
||||
if (root == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < root->_size; ++i)
|
||||
{
|
||||
_InOrder(root->_subs[i]);
|
||||
cout << root->_keys[i] << " ";
|
||||
}
|
||||
|
||||
_InOrder(root->_subs[root->_size]);
|
||||
}
|
||||
|
||||
protected:
|
||||
Node* _root;
|
||||
};
|
||||
|
||||
|
||||
#endif //GENERAL_BTREE_H
|
Loading…
Reference in New Issue