B树

  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 }

 

posted @ 2016-05-03 14:18  *尘封的记忆*  阅读(173)  评论(0编辑  收藏  举报