GTree和BTree中都有遍历相关的函数,因此,我们将这些遍历相关的函数放到Tree.h中,作为纯虚函数声明:
如下:
1 virtual bool insert(TreeNode<T>* node) = 0; 2 virtual bool insert(const T& value, TreeNode<T>* parent) = 0; 3 virtual SharedPointer< Tree<T> > remove(const T& value) = 0; //删除的节点的子节点我们还需要处理,因此要返回删除节点的指针, 4 //这样有机会对里面的元素做进一步操作 5 virtual SharedPointer< Tree<T> > remove(TreeNode<T>* node) = 0; 6 virtual TreeNode<T>* find(const T& value) const = 0; 7 virtual TreeNode<T>* find(TreeNode<T>* node) const = 0; 8 virtual TreeNode<T>* root() const = 0; 9 virtual int degree() const = 0; 10 virtual int count() const = 0; 11 virtual int height() const = 0; 12 virtual void clear() = 0; 13 virtual bool begin() = 0; 14 virtual bool end() = 0; 15 virtual bool next() = 0; 16 virtual T current() = 0;
BTree.h中添加遍历相关的函数:
1 #ifndef BTREE_H 2 #define BTREE_H 3 4 #include "Tree.h" 5 #include "BTreeNode.h" 6 #include "Exception.h" 7 #include "LinkQueue.h" 8 9 10 namespace DTLib 11 { 12 13 template < typename T > 14 class BTree : public Tree<T> 15 { 16 protected: 17 LinkQueue<BTreeNode<T>*> m_queue; 18 //定义递归功能函数 19 virtual BTreeNode<T>* find(BTreeNode<T>* node, const T& value) const 20 { 21 BTreeNode<T>* ret = NULL; 22 23 if( node != NULL ) 24 { 25 if( node->value == value ) 26 { 27 ret = node; 28 } 29 else 30 { 31 if( ret == NULL ) 32 { 33 ret = find(node->left, value); 34 } 35 36 if( ret == NULL ) 37 { 38 ret = find(node->right, value); 39 } 40 } 41 } 42 43 return ret; 44 } 45 46 virtual BTreeNode<T>* find(BTreeNode<T>* node, BTreeNode<T>* obj) const 47 { 48 BTreeNode<T>* ret = NULL; 49 50 if( node == obj ) 51 { 52 ret = node; 53 } 54 else 55 { 56 if( node != NULL ) 57 { 58 if( ret == NULL ) 59 { 60 ret = find(node->left, obj); 61 } 62 63 if( ret == NULL ) 64 { 65 ret = find(node->right, obj); 66 } 67 } 68 } 69 70 return ret; 71 } 72 73 virtual bool insert(BTreeNode<T>* n, BTreeNode<T>* np, BTNodePos pos) 74 { 75 bool ret = true; 76 77 if( pos == ANY ) 78 { 79 if( np->left == NULL ) 80 { 81 np->left = n; 82 } 83 else if( np->right == NULL ) 84 { 85 np->right = n; 86 } 87 else 88 { 89 ret = false; 90 } 91 } 92 else if( pos == LEFT ) 93 { 94 if( np->left == NULL ) 95 { 96 np->left = n; 97 } 98 else 99 { 100 ret = false; 101 } 102 } 103 else if( pos == RIGHT ) 104 { 105 if( np->right == NULL ) 106 { 107 np->right = n; 108 } 109 else 110 { 111 ret = false; 112 } 113 } 114 else 115 { 116 ret = false; 117 } 118 119 return ret; 120 } 121 122 virtual void remove(BTreeNode<T>* node, BTree<T>*& ret) 123 { 124 ret = new BTree<T>(); 125 126 if( ret == NULL ) 127 { 128 THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create btree..."); 129 } 130 else 131 { 132 if( root() == node ) 133 { 134 this->m_root = NULL; 135 } 136 else 137 { 138 BTreeNode<T>* parent = dynamic_cast<BTreeNode<T>*>(node->parent); 139 140 if( parent->left == node ) 141 { 142 parent->left = NULL; 143 } 144 else if( parent->right == node ) 145 { 146 parent->right = NULL; 147 } 148 149 node->parent = NULL; 150 } 151 152 ret->m_root = node; //作为子树返回 153 } 154 } 155 156 virtual void free(BTreeNode<T>* node) 157 { 158 if( node != NULL ) 159 { 160 free(node->left); 161 free(node->right); 162 163 if( node->flag() ) 164 { 165 delete node; 166 } 167 } 168 } 169 #if 0 170 int count(BTreeNode<T>* node) const 171 { 172 int ret = 0; 173 174 if( node != NULL ) 175 { 176 ret = count(node->left) + count(node->right) + 1; 177 } 178 179 return ret; 180 } 181 #endif 182 183 int count(BTreeNode<T>* node) const 184 { 185 return (node != NULL) ? (count(node->left) + count(node->right) + 1) : 0; 186 } 187 188 int height(BTreeNode<T>* node) const 189 { 190 int ret = 0; 191 192 if( node != NULL ) 193 { 194 int lh = height(node->left); 195 int rh = height(node->right); 196 197 ret = ((lh > rh) ? lh : rh) + 1;; 198 } 199 200 return ret; 201 } 202 203 #if 0 204 int degree(BTreeNode<T>* node) const 205 { 206 int ret = 0; 207 208 if( node != NULL ) 209 { 210 int dl = degree(node->left); 211 int dr = degree(node->right); 212 213 ret = (!!node->left + !!node->right); 214 215 if( ret < dl ) 216 { 217 ret = dl; 218 } 219 220 if( ret < dr ) 221 { 222 ret = dr; 223 } 224 } 225 226 return ret; 227 } 228 #endif 229 //二叉树的最大度数为2,上面的实现效率太低 230 int degree(BTreeNode<T>* node) const 231 { 232 int ret = 0; 233 234 if( node != NULL ) 235 { 236 BTreeNode<T>* child[] = {node->left, node->right}; 237 238 ret = (!!node->left + !!node->right); 239 240 for( int i = 0; (i < 2) && (ret < 2); i++) 241 { 242 int d = degree(child[i]); 243 244 if( ret < d ) 245 { 246 ret = d; 247 } 248 } 249 } 250 251 return ret; 252 } 253 public: 254 bool insert(TreeNode<T>* node) 255 { 256 return insert(node, ANY); 257 } 258 259 virtual bool insert(TreeNode<T>* node, BTNodePos pos) 260 { 261 bool ret = true; 262 263 if( node != NULL ) 264 { 265 if( this->m_root == NULL ) //空树 266 { 267 node->parent = NULL; 268 this->m_root = node; 269 } 270 else 271 { 272 BTreeNode<T>* np = find(node->parent); 273 274 if( np != NULL ) 275 { 276 ret = insert(dynamic_cast<BTreeNode<T>*>(node), np, pos); 277 } 278 else 279 { 280 THROW_EXCEPTION(InvalidParameterException, "invalid parent tree node..."); 281 } 282 } 283 } 284 else 285 { 286 THROW_EXCEPTION(InvalidParameterException, "parameter node can not be null..."); 287 } 288 289 return ret; 290 } 291 292 bool insert(const T& value, TreeNode<T>* parent) 293 { 294 return insert(value, parent, ANY); 295 } 296 297 virtual bool insert(const T& value, TreeNode<T>* parent, BTNodePos pos) 298 { 299 bool ret = true; 300 BTreeNode<T>* node = BTreeNode<T>::NewNode(); 301 302 if( node == NULL ) 303 { 304 THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create node..."); 305 } 306 else 307 { 308 node->value = value; 309 node->parent = parent; 310 311 ret = insert(node, pos); 312 313 if( !ret ) 314 { 315 delete node; 316 } 317 } 318 319 return ret; 320 } 321 322 SharedPointer< Tree<T> > remove(TreeNode<T>* node) //删除的节点的子节点我们还需要处理,因此要返回删除节点的指针,//这样有机会对里面的元素做进一步操作 323 { 324 BTree<T>* ret = NULL; 325 326 node = find(node); 327 328 if( node == NULL ) 329 { 330 THROW_EXCEPTION(InvalidParameterException, "parameter is invalid..."); 331 } 332 else 333 { 334 remove(dynamic_cast<BTreeNode<T>*>(node), ret); 335 336 m_queue.clear(); 337 } 338 339 return ret; 340 } 341 342 SharedPointer< Tree<T> > remove(const T& value) 343 { 344 BTree<T>* ret = NULL; 345 346 BTreeNode<T>* node = find(value); 347 348 if( node == NULL ) 349 { 350 THROW_EXCEPTION(InvalidParameterException, "can not find node via value..."); 351 } 352 else 353 { 354 remove(node, ret); 355 356 m_queue.clear(); 357 } 358 359 return ret; 360 } 361 362 BTreeNode<T>* find(const T& value) const 363 { 364 return find(root(), value); 365 } 366 367 BTreeNode<T>* find(TreeNode<T>* node) const 368 { 369 return find(root(), dynamic_cast<BTreeNode<T>*>(node)); 370 } 371 372 BTreeNode<T>* root() const 373 { 374 return dynamic_cast<BTreeNode<T>*>(this->m_root); 375 } 376 377 int degree() const 378 { 379 return degree(root()); 380 } 381 382 int count() const 383 { 384 return count(root()); 385 } 386 387 int height() const 388 { 389 return height(root()); 390 } 391 392 void clear() 393 { 394 free(root()); 395 396 m_queue.clear(); 397 398 this->m_root = NULL; 399 } 400 401 bool begin() 402 { 403 bool ret = ( root() != NULL ); 404 405 if( ret ) 406 { 407 m_queue.clear(); 408 m_queue.add(root()); 409 } 410 411 return ret; 412 } 413 414 bool end() 415 { 416 return (m_queue.length() == 0); 417 } 418 419 bool next() 420 { 421 bool ret = (m_queue.length() > 0); 422 423 if( ret ) 424 { 425 BTreeNode<T>* node = m_queue.front(); 426 427 m_queue.remove(); //将对头元素出队,相当于移动游标 428 429 if( node->left != NULL ) 430 { 431 m_queue.add(node->left); 432 } 433 434 if( node->right ) 435 { 436 m_queue.add(node->right); 437 } 438 } 439 440 return ret; 441 } 442 443 T current() 444 { 445 if( !end() ) //遍历的过程当中调用current函数才有意义 446 { 447 return m_queue.front()->value; 448 } 449 else 450 { 451 THROW_EXCEPTION(InvalidOperationException, "No value at current position..."); 452 } 453 } 454 455 ~BTree() 456 { 457 clear(); 458 } 459 }; 460 461 } 462 463 #endif // BTREE_H
测试程序如下:
1 #include <iostream> 2 #include "GTree.h" 3 #include "GTreeNode.h" 4 #include "BTree.h" 5 #include "BTreeNode.h" 6 7 8 using namespace std; 9 using namespace DTLib; 10 11 12 int main() 13 { 14 BTree<int> bt; 15 BTreeNode<int>* n = NULL; 16 17 bt.insert(1, NULL); 18 19 n = bt.find(1); 20 bt.insert(2, n); 21 bt.insert(3, n); 22 23 n = bt.find(2); 24 bt.insert(4, n); 25 bt.insert(5, n); 26 27 n = bt.find(4); 28 bt.insert(8, n); 29 bt.insert(9, n); 30 31 n = bt.find(5); 32 bt.insert(10, n); 33 34 n = bt.find(3); 35 bt.insert(6, n); 36 bt.insert(7, n); 37 38 39 cout << bt.count() << endl; 40 cout << bt.height() << endl; 41 cout << bt.degree() << endl; 42 /* 43 int a[] = {8, 9, 10, 11, 7}; 44 45 SharedPointer< Tree<int> > sp = bt.remove(3); 46 47 for(int i = 0; i < 5; i++) 48 { 49 TreeNode<int>* node = bt.find(a[i]); 50 51 while( node ) 52 { 53 cout << node->value << " "; 54 node = node->parent; 55 } 56 57 cout << endl; 58 } 59 60 */ 61 62 cout << endl; 63 64 for(bt.begin(); !bt.end(); bt.next()) 65 { 66 cout << bt.current() << " "; 67 } 68 69 cout << endl; 70 71 return 0; 72 }
结果如下: