1 #include<iostream>
2 using namespace std;
3 template<class K,int M=3>
4 struct BTreeNode
5 {
6 K _keys[M];
7 BTreeNode<K, M>* _subs[M+1];
8 size_t size;
9 BTreeNode<K, M>* _parent;
10 BTreeNode() :size(0), _parent(NULL)
11 {
12 for (size_t i = 0 ; i < M + 1; ++i)
13 {
14 _subs[i] = NULL;
15 }
16 }
17 };
18
19 template<class K, class V>
20 struct Pair
21 {
22 K _first;
23 V _second;
24 Pair(const K&k = K(), const V&v = V())
25 :_first(k), _second(v)
26 {}
27 };
28
29 template<class K,int M=3>
30 class BTree
31 {
32 typedef BTreeNode<K, M> Node;
33 public:
34 BTree() :_root(NULL)
35 {}
36 Pair<Node*, int> Find(const K&key)
37 {
38 Node* parent = NULL;
39 Node* cur = _root;
40 while (cur)
41 {
42 int i = 0;
43 while (i<cur->size&&cur->_keys[i]<key)
44 {
45 ++i;
46 }
47 if (cur->_keys[i] == key)
48 {
49 return Pair<Node*, int>(cur, i);
50 }
51 parent = cur;
52 cur = cur->_subs[i];
53 }
54 return Pair<Node*, int>(parent, -1);
55 }
56
57 bool Insert(const K&key)
58 {
59 if (_root == NULL)
60 {
61 _root = new Node;
62 _root->_keys[0] = key;
63 ++_root->size;
64 return true;
65 }
66
67 Pair<Node*, int> ret = Find(key);
68 if (ret._second != -1)
69 {
70 return false;
71 }
72
73 K k = key;
74 Node* cur = ret._first;
75 Node* sub = NULL;
76 _InsertKey(cur, k, sub);
77 while (1)
78 {
79 if (cur->size < M)
80 {
81 return true;
82 }
83 int boundary = M / 2;
84 k = cur->_keys[boundary];
85 Node *tmp = new Node;
86 size_t size = cur->size;
87 size_t index = 0;
88 for (int i = boundary + 1; i < size; ++i)
89 {
90 tmp->_keys[index++] = cur->_keys[i];
91 tmp->size++;
92 cur->size--;
93 }
94
95
96 index = 0;
97 for (int i = boundary + 1; i <= size; ++i)
98 {
99 tmp->_subs[index] = cur->_subs[i];
100 if (tmp->_subs[index])
101 {
102 tmp->_subs[index]->_parent = tmp;
103 }
104 ++index;
105 }
106
107 K k = cur->_keys[boundary];
108 cur->size--;
109 if (cur->_parent == NULL)
110 {
111 _root = new Node;
112 _root->_keys[0] = k;
113 _root->_subs[0] = cur;
114 _root->_subs[1] = tmp;
115 _root->size = 1;
116 tmp->_parent = _root;
117 cur->_parent = _root;
118 return true;
119 }
120 else
121 {
122 cur= cur->_parent;
123 _InsertKey(cur, k, sub);
124 ret = Find(k);
125 int i = ret._second + 1;
126 cur->_subs[i] = tmp;
127 tmp->_parent = cur;
128 }
129 }
130 }
131
132 void Inorder()
133 {
134 _Inorder(_root);
135 cout << endl;
136 }
137
138 void _Inorder(Node* root)
139 {
140 if (root == NULL)
141 {
142 return;
143 }
144 for (size_t i = 0; i < root->size; ++i)
145 {
146 _Inorder(root->_subs[i]);
147 cout << root->_keys[i] << " ";
148 }
149 _Inorder(root->_subs[root->size]);
150 }
151
152 void _InsertKey(Node* cur, const K&k, Node* sub)
153 {
154 int i = cur->size - 1;
155 while (i>=0)
156 {
157 if (cur->_keys[i] > k)
158 {
159 cur->_keys[i + 1] = cur->_keys[i];
160 cur->_subs[i + 2] = cur->_subs[i+1];
161 --i;
162 }
163 else
164 {
165 break;
166 }
167 }
168 cur->_keys[i + 1] = k;
169 cur->_subs[i + 2] = sub;
170 if (sub)
171 {
172 sub->_parent = cur;
173 }
174 cur->size++;
175 }
176 protected:
177 Node* _root;
178 };
179 void TestBTree()
180 {
181 BTree<int> t;
182 int a[] = { 53, 75, 139, 49, 145, 36, 10 };
183 for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++i)
184 {
185 t.Insert(a[i]);
186 }
187 t.Inorder();
188 }
189 void TestBTree1()
190 {
191 BTree<int> t1;
192 int a[] = { 63, 75, 139, 49, 36, 10, 65, 78, 99,132,28,76,156,198};
193 for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++i)
194 {
195 t1.Insert(a[i]);
196 }
197 t1.Inorder();
198 }
199
200 int main()
201 {
202 TestBTree1();
203 system("pause");
204 return 0;
205 }