KSquare Utilities
RBTree.h
Go to the documentation of this file.
1 /* RBTree.h -- Implementation of Red-Black binary tree.
2  * Copyright (C) 1994-2014 Kurt Kramer
3  * For conditions of distribution and use, see copyright notice in KKB.h
4  */
5 #ifndef _RBTREE_
6 #define _RBTREE_
7 
8 //************************************************************************************
9 //* *
10 //* Developed By: Kurt A. Kramer *
11 //* *
12 //* Date: October-26-2003 *
13 //************************************************************************************
14 //* *
15 //* Utilized algorithms from Introduction to Algorithms by Cormen. *
16 //* *
17 //************************************************************************************
18 
19 
20 #include <assert.h>
21 #include <ctype.h>
22 #include <limits.h>
23 #include <stdlib.h>
24 #include <memory>
25 
26 #include "KKBaseTypes.h"
27 
28 namespace KKB
29 {
30  enum class RBcolor {Red, Black};
31 
32  template <class Entry>
33  class RBnode
34  {
35  typedef Entry* EntryPtr;
36 
37  typedef RBnode* RBnodePtr;
38 
39  public:
40  RBnode (RBnodePtr _parent,
41  RBnodePtr _left,
42  RBnodePtr _right,
43  RBcolor _color,
44  EntryPtr _entry
45  );
46 
47  RBcolor Color () {return color;}
48  EntryPtr Data () {return entry;}
49  RBnodePtr Left () {return left;}
50  RBnodePtr Parent () {return parent;}
51  RBnodePtr Right () {return right;}
52 
53  void Color (RBcolor _color) {color = _color;}
54  void Data (EntryPtr _data) {entry = _data;}
55  void Left (RBnodePtr _left) {left = _left;}
56  void Parent (RBnodePtr _parent) {parent = _parent;}
57  void Right (RBnodePtr _right) {right = _right;}
58 
59  private:
60  RBnodePtr parent;
61  RBnodePtr left;
62  RBnodePtr right;
63  EntryPtr entry;
64  RBcolor color;
65  }; /* RBnode */
66 
67 
68  template <class Entry,class CompareNodes,typename KeyType>
69  class RBTree;
70 
71  template <class Entry, class CompareNodes,typename KeyType>
72  class Iterator
73  {
74  public:
75  typedef RBTree<Entry,CompareNodes,KeyType>* TreePtr;
76 
77  typedef Entry* EntryPtr;
78 
79  typedef RBnode<Entry>* NodePtr;
80 
82 
83  Iterator (TreePtr _tree);
84 
85  ~Iterator ();
86 
87  EntryPtr GetEqual (const KeyType& key);
88 
89  EntryPtr GetGreater (const KeyType& key);
90 
91  EntryPtr GetGreaterOrEqual (const KeyType& key);
92 
93  EntryPtr GetFirst ();
94 
95  EntryPtr GetLast ();
96 
97  EntryPtr GetNext ();
98 
99  EntryPtr GetPrev ();
100 
101  private:
102  void IsTreeStillThere ();
103 
104  void TreeHasBeenDeleted ();
105 
106  void DeletionOfNode (NodePtr n);
107 
108  void InsertionOfNode (NodePtr n);
109 
110  NodePtr prevNode;
111  NodePtr curNode;
112  NodePtr nextNode;
113 
114  TreePtr tree;
115  }; /* Iterator */
116 
117 
118  template <class Entry,class CompareNodes,typename KeyType>
119  class RBTree
120  {
121  public:
122  typedef Entry* EntryPtr;
123  typedef RBnode<Entry> Node;
124  typedef Node* NodePtr;
125 
126  typedef RBTree<Entry,CompareNodes,KeyType> Tree;
127 
128  typedef Tree* TreePtr;
129 
131 
132  RBTree (CompareNodes& _comparator,
133  bool _owner
134  );
135 
136  RBTree (RBTree& tree);
137 
138  ~RBTree ();
139 
140  kkuint32 Size () {return size;}
141 
142  void WalkTree () {WalkTree (root);}
143 
144  void CalcTreeStats ();
145 
146  bool CompareToTree (TreePtr tree);
147 
148  void DeleteCurrentNode ();
149 
150  void DeleteEntry (EntryPtr e);
151 
152  EntryPtr GetEqual (const KeyType& key);
153 
154  EntryPtr GetFirst ();
155 
156  EntryPtr GetGreater (const KeyType& key);
157 
158  EntryPtr GetGreaterOrEqual (const KeyType& key);
159 
160  EntryPtr GetLess (const KeyType& key);
161 
162  EntryPtr GetLast ();
163 
164  EntryPtr GetNext () {return Successor ();}
165 
166  EntryPtr GetPrev () {return Predecessor ();}
167 
169 
171 
172  EntryPtr Successor ();
173 
174  bool Validate ();
175 
176  typedef Iterator<Entry,CompareNodes,KeyType>* IteratorPtr;
177 
178  private:
179  void CheckNodeStats (NodePtr n,
180  kkint32& numOfNodes,
181  kkint32& numOfLeafs,
182  kkint32* leafPaths,
183  kkint32& shortestPath,
184  kkint32& longestPath,
185  kkint32 curDeapth
186  );
187 
188  NodePtr CloneSubTree (NodePtr s,
189  NodePtr sNil,
190  NodePtr dParent
191  );
192 
193  bool AreSubTreesTheSame (NodePtr n1,
194  NodePtr n1NIL,
195  NodePtr n2,
196  NodePtr n2NIL
197  );
198 
199  kkint32 CountNodesInSubTree (NodePtr subTree);
200 
201  NodePtr Delete (NodePtr node2Delete);
202 
203  void DeleteSubTree (NodePtr treeRoot);
204 
205  NodePtr GetEqual (NodePtr subTree,
206  const KeyType& key
207  );
208 
209  NodePtr GetGreater (NodePtr subTree,
210  const KeyType& key
211  );
212 
213  NodePtr GetGreaterOrEqual (NodePtr subTree,
214  const KeyType& key
215  );
216 
217  NodePtr GetLess (NodePtr subTree,
218  const KeyType& key
219  );
220 
221  void IteratorDelete (IteratorPtr newIterator);
222 
223  void IteratorAdd (IteratorPtr newIterator);
224 
225  NodePtr Insert (EntryPtr _entry);
226 
227  NodePtr LeftRotate (NodePtr x);
228 
229  NodePtr Maximum (NodePtr n);
230 
231  NodePtr Minimum () {return Minimum (root);}
232 
233  NodePtr Minimum (NodePtr n);
234 
235  NodePtr Predecessor (NodePtr n);
236 
237  NodePtr RBDelete (NodePtr z);
238 
239  void RBDeleteFixUp (NodePtr x);
240 
241  NodePtr RightRotate (NodePtr x);
242 
243  NodePtr SearchForEntry (NodePtr n, // Will walk the subtree pointed to by 'n' and
244  Entry* e // return the node that is pointing to 'e'.
245  );
246 
247  NodePtr Successor (NodePtr n);
248 
249  kkint32 ValidateSubTree (NodePtr subTree,
250  NodePtr theParent,
251  const char* linkDescription,
252  kkint32 blackNodeCount,
253  kkint32& blackNodeHeight
254  );
255 
256  void WalkTree (NodePtr n);
257 
258  CompareNodes& comparator;
259 
260  Node* curNode;
261 
262  Node* nil;
263 
264  bool owner; /**< if True this instance owns the objects it contains and is responsible for deleting them when it is deleted. */
265 
266  Node* root;
267 
268  kkuint32 size;
269 
270 
271  kkint32 numOfIterators;
272  IteratorPtr* iterators;
273  }; /* RBTree */
274 } /* KKB */
275 
276 
277 using namespace KKB;
278 
279 
280 template <class Entry>
281 KKB::RBnode<Entry>::RBnode (RBnodePtr _parent,
282  RBnodePtr _left,
283  RBnodePtr _right,
284  RBcolor _color,
285  EntryPtr _entry
286  ):
287  parent (_parent),
288  left (_left),
289  right (_right),
290  entry (_entry),
291  color (_color)
292 {}
293 
294 
295 
296 
297 template <class Entry,class CompareNodes,typename KeyType>
298 KKB::RBTree<Entry,CompareNodes,KeyType>::RBTree (CompareNodes& _comparator,
299  bool _owner
300  ):
301  comparator (_comparator),
302  curNode (NULL),
303  nil (NULL),
304  owner (_owner),
305  root (NULL),
306  size (0),
307  numOfIterators(0),
308  iterators (NULL)
309 {
310  nil = new RBnode<Entry> (NULL, NULL, NULL, RBcolor::Black, NULL);
311  root = nil;
312  curNode = nil;
313 }
314 
315 
316 
317 
318 template <class Entry,class CompareNodes,typename KeyType>
319 KKB::RBTree<Entry,CompareNodes,KeyType>::RBTree (RBTree& tree):
320 
321  comparator (tree.comparator),
322  size (tree.size),
323  owner (true),
324  root (NULL),
325  nil (NULL),
326  numOfIterators(0),
327  iterators (NULL)
328 {
329  nil = new RBnode<Entry> (NULL, NULL, NULL, Black, NULL);
330  root = CloneSubTree (tree.root, tree.nil, nil);
331 
332  kkint32 x = CountNodesInSubTree (root);
333 
334  curNode = nil;
335 }
336 
337 
338 
339 
340 template <class Entry,class CompareNodes,typename KeyType>
341 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::CloneSubTree (NodePtr s,
342  NodePtr sNil,
343  NodePtr dParent
344  )
345 {
346  if (s == sNil)
347  return nil;
348 
349  EntryPtr entry = new Entry (*(s->Data ()));
350 
351  NodePtr newNode = new Node (dParent,
352  nil,
353  nil,
354  s->Color (),
355  entry
356  );
357 
358  NodePtr leftSubTree = CloneSubTree (s->Left (), sNil, newNode);
359  NodePtr rightSubTree = CloneSubTree (s->Right (), sNil, newNode);
360 
361  newNode->Left (leftSubTree);
362  newNode->Right (rightSubTree);
363 
364  return newNode;
365 } /* CloneSubTree */
366 
367 
368 
369 template <class Entry,class CompareNodes,typename KeyType>
370 KKB::RBTree<Entry,CompareNodes,KeyType>::~RBTree ()
371 {
372  if (root != nil)
373  DeleteSubTree (root);
374 
375 
376  for (kkint32 i = 0; i < numOfIterators; i++)
377  {
378  iterators[i]->TreeHasBeenDeleted ();
379  }
380 
381  delete nil;
382 }
383 
384 
385 
386 
387 template <class Entry,class CompareNodes,typename KeyType>
388 void KKB::RBTree<Entry,CompareNodes,KeyType>::DeleteSubTree (NodePtr treeRoot)
389 {
390  if (treeRoot == nil)
391  return;
392 
393  if (treeRoot->Left () != nil)
394  DeleteSubTree (treeRoot->Left ());
395 
396  if (treeRoot->Right () != nil)
397  DeleteSubTree (treeRoot->Right ());
398 
399  if (owner)
400  delete treeRoot->Data ();
401 
402  delete treeRoot;
403 } /* DeleteSubTree */
404 
405 
406 
407 
408 template <class Entry,class CompareNodes,typename KeyType>
409 bool KKB::RBTree<Entry,CompareNodes,KeyType>::CompareToTree (TreePtr tree)
410 {
411  return AreSubTreesTheSame (root, nil, tree->root, tree->nil);
412 } /* CompareToTree */
413 
414 
415 
416 
417 template <class Entry,class CompareNodes,typename KeyType>
418 bool KKB::RBTree<Entry,CompareNodes,KeyType>::AreSubTreesTheSame (NodePtr n1,
419  NodePtr n1NIL,
420  NodePtr n2,
421  NodePtr n2NIL
422  )
423 {
424  if ((n1 == n1NIL) && (n2 == n2NIL))
425  return true;
426 
427  if ((n1 == n1NIL) || (n2 == n2NIL))
428  return false;
429 
430 
431  if (*(n1->Data ()) == *(n2->Data ()))
432  {
433  if (!AreSubTreesTheSame (n1->Left (), n1NIL, n2->Left (), n2NIL))
434  return false;
435 
436  if (!AreSubTreesTheSame (n1->Right (), n1NIL, n2->Right (), n2NIL))
437  return false;
438  }
439  else
440  {
441  return false;
442  }
443 
444  return true;
445 }
446 
447 
448 
449 
450 template <class Entry,class CompareNodes,typename KeyType>
451 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::GetEqual (NodePtr subTree,
452  const KeyType& key
453  )
454 {
455  if (subTree == nil)
456  return nil;
457 
458  NodePtr n = subTree;
459 
460  //KeyType nodeKey;
461 
462  NodePtr lastEqual = nil;
463 
464  while (n != nil)
465  {
466  const KeyType& nodeKey = comparator.ExtractKey (n->Data ());
467 
468  if (key < nodeKey)
469  {
470  n = n->Left ();
471  }
472 
473  else if (key > nodeKey)
474  {
475  n = n->Right ();
476  }
477 
478  else
479  {
480  lastEqual = n;
481  n = n->Left ();
482  }
483  }
484 
485  return lastEqual;
486 } /* GetEqual */
487 
488 
489 
490 
491 
492 template <class Entry,class CompareNodes,typename KeyType>
493 Entry* KKB::RBTree<Entry,CompareNodes,KeyType>::GetEqual (const KeyType& key)
494 {
495  curNode = GetEqual (root, key);
496 
497  if (curNode == nil)
498  return NULL;
499 
500  return curNode->Data ();
501 }
502 
503 
504 
505 
506 
507 template <class Entry,class CompareNodes,typename KeyType>
508 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::GetGreater (NodePtr subTree,
509  const KeyType& key
510  )
511 {
512  if ((subTree == nil) || (subTree == NULL))
513  return nil;
514 
515  NodePtr n = subTree;
516  NodePtr lastGreater = nil;
517 
518  bool found = false;
519 
520  while (n != nil)
521  {
522  KeyType nodeKey = comparator.ExtractKey (n->Data ());
523 
524  if (key < nodeKey)
525  {
526  lastGreater = n;
527  n = n->Left ();
528  }
529 
530  else
531  {
532  n = n->Right ();
533  }
534  }
535 
536  if (lastGreater == nil)
537  {
538  curNode = nil;
539  return nil;
540  }
541 
542  curNode = lastGreater;
543 
544  return curNode;
545 } /* GetGreater */
546 
547 
548 
549 
550 
551 template <class Entry,class CompareNodes,typename KeyType>
552 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::GetGreaterOrEqual (NodePtr subTree,
553  const KeyType& key
554  )
555 {
556  if ((subTree == nil) || (subTree == NULL))
557  return nil;
558 
559  NodePtr n = subTree;
560  NodePtr lastGreater = nil;
561 
562  bool found = false;
563 
564  while (n != nil)
565  {
566  KeyType nodeKey = comparator.ExtractKey (n->Data ());
567 
568  if (key <= nodeKey)
569  {
570  lastGreater = n;
571  n = n->Left ();
572  }
573 
574  else
575  {
576  n = n->Right ();
577  }
578  }
579 
580  if (lastGreater == nil)
581  {
582  curNode = nil;
583  return nil;
584  }
585 
586  curNode = lastGreater;
587 
588  return curNode;
589 } /* GetGreater */
590 
591 
592 
593 
594 
595 
596 
597 template <class Entry,class CompareNodes,typename KeyType>
598 Entry* KKB::RBTree<Entry,CompareNodes,KeyType>::GetGreater (const KeyType& key)
599 {
600  curNode = GetGreater (root, key);
601  return curNode->Data ();
602 } /* GetGreater */
603 
604 
605 
606 
607 template <class Entry,class CompareNodes,typename KeyType>
608 Entry* KKB::RBTree<Entry,CompareNodes,KeyType>::GetGreaterOrEqual (const KeyType& key)
609 {
610  curNode = GetGreaterOrEqual (root, key);
611  return curNode->Data ();
612 } /* GetGreater */
613 
614 
615 
616 
617 template <class Entry,class CompareNodes,typename KeyType>
618 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::GetLess (NodePtr subTree,
619  const KeyType& key
620  )
621 {
622  if ((subTree == nil) || (subTree == NULL))
623  return nil;
624 
625  NodePtr n = subTree;
626  NodePtr lastLess = nil;
627 
628  bool found = false;
629 
630  KeyType nodeKey;
631 
632  while (n != nil)
633  {
634  KeyType nodeKey = comparator.ExtractKey (n->Data ());
635 
636  if (key > nodeKey)
637  {
638  lastLess = n;
639  n = n->Left ();
640  }
641 
642  else
643  {
644  n = n->Right ();
645  }
646  }
647 
648  if (lastLess == nil)
649  {
650  return nil;
651  }
652 
653  n = lastLess;
654 
655  while ((n != nil) && (comparator.ExtractKey (n) < key))
656  {
657  lastLess = n;
658  n = Successor (n);
659  }
660 
661  return lastLess;
662 } /* GetLess */
663 
664 
665 
666 
667 
668 template <class Entry,class CompareNodes,typename KeyType>
669 Entry* KKB::RBTree<Entry,CompareNodes,KeyType>::GetLess (const KeyType& key)
670 {
671  curNode = GetLess (root, key);
672  return curNode->Data ();
673 } /* GetGreater */
674 
675 
676 
677 
678 
679 
680 
681 template <class Entry,class CompareNodes,typename KeyType>
682 Entry* KKB::RBTree<Entry,CompareNodes,KeyType>::Predecessor ()
683 {
684  if ((curNode == nil) || (curNode == NULL))
685  return NULL;
686 
687  curNode = Predecessor (curNode);
688 
689  if ((curNode == nil) || (curNode == NULL))
690  return NULL;
691 
692  return curNode->Data ();
693 } /* Predecessor */
694 
695 
696 
697 
698 
699 template <class Entry,class CompareNodes,typename KeyType>
700 Entry* KKB::RBTree<Entry,CompareNodes,KeyType>::Successor ()
701 {
702  if ((curNode == nil) || (curNode == NULL))
703  return NULL;
704 
705  curNode = Successor (curNode);
706 
707  if ((curNode == nil) || (curNode == NULL))
708  return NULL;
709 
710  return curNode->Data ();
711 } /* Successor */
712 
713 
714 
715 
716 
717 template <class Entry,class CompareNodes,typename KeyType>
718 void KKB::RBTree<Entry,CompareNodes,KeyType>::DeleteCurrentNode ()
719 {
720  if ((curNode == nil) || (curNode == NULL))
721  {
722  std::cerr << std::endl;
723  std::cerr << " *** Warning ***" << std::endl;
724  std::cerr << std::endl;
725  std::cerr << "RBTree<Entry,CompareNodes,KeyType>::DeleteCurrentNode - No Current Node Defined." << std::endl;
726  std::cerr << std::endl;
727  return;
728  }
729 
730 
731  EntryPtr entry2Delete = curNode->Data ();
732 
733  NodePtr node2Delete = curNode;
734 
735  curNode = Predecessor (node2Delete);
736  if ((curNode == nil) || (curNode == NULL))
737  curNode = Successor (node2Delete);
738 
739 
740  NodePtr deletedNode = RBDelete (node2Delete);
741 
742  if (deletedNode->Data () != entry2Delete)
743  {
744  std::cerr << std::endl;
745  std::cerr << " *** ERROR ***" << std::endl;
746  std::cerr << std::endl;
747  std::cerr << "RBTree<Entry,CompareNodes,KeyType>::DeleteCurrentNode - Wrong Node was Returned for Deletion." << std::endl;
748  std::cerr << std::endl;
749  }
750  else
751  {
752  if (owner)
753  delete deletedNode->Data ();
754 
755  delete deletedNode;
756  }
757 } /* DeleteCurrentNode */
758 
759 
760 
761 
762 template <class Entry,class CompareNodes,typename KeyType>
763 Entry* KKB::RBTree<Entry,CompareNodes,KeyType>::GetFirst ()
764 {
765  if (root == nil)
766  return NULL;
767 
768  curNode = Minimum ();
769  return curNode->Data ();
770 } /* GetFirst () */
771 
772 
773 
774 
775 template <class Entry,class CompareNodes,typename KeyType>
776 Entry* KKB::RBTree<Entry,CompareNodes,KeyType>::GetLast ()
777 {
778  if (root == nil)
779  return NULL;
780 
781  curNode = Maximum ();
782  return curNode->Data ();
783 } /* GetLast () */
784 
785 
786 
787 
788 
789 template <class Entry,class CompareNodes,typename KeyType>
790 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::Insert (EntryPtr _entry)
791 {
792  NodePtr newNode = NULL;
793 
794  const KeyType& newKey = comparator.ExtractKey (_entry);
795 
796  if (root == nil)
797  {
798  newNode = new RBnode<Entry> (nil, nil, nil, RBcolor::Red, _entry);
799  root = newNode;
800  }
801  else
802  {
803  NodePtr next = root;
804  NodePtr last = root;
805 
806  kkint32 lastBranch = 0;
807 
808  while (next != nil)
809  {
810  last = next;
811 
812  const KeyType& nextKey = comparator.ExtractKey (next->Data ());
813 
814  if (newKey < nextKey)
815  {
816  lastBranch = -1;
817  next = next->Left ();
818  }
819  else
820  {
821  lastBranch = 1;
822  next = next->Right ();
823  }
824  }
825 
826  newNode = new RBnode<Entry> (last, nil, nil, RBcolor::Red, _entry);
827 
828  if (lastBranch < 0)
829  {
830  last->Left (newNode);
831  }
832  else
833  {
834  last->Right (newNode);
835  }
836  }
837 
838  size++;
839 
840  curNode = newNode;
841 
842  return newNode;
843 } /* Insert */
844 
845 
846 
847 
848 
849 template <class Entry,class CompareNodes,typename KeyType>
850 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::Minimum (NodePtr n)
851 {
852  while (n->Left () != nil)
853  n = n->Left ();
854 
855  return n;
856 }
857 
858 
859 
860 
861 
862 template <class Entry,class CompareNodes,typename KeyType>
863 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::Maximum (NodePtr n)
864 {
865  while (n->Right () != nil)
866  n = n->Right ();
867 
868  return n;
869 }
870 
871 
872 
873 
874 
875 
876 template <class Entry,class CompareNodes,typename KeyType>
877 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::Successor (NodePtr n)
878 {
879  if ((n == nil) || (n == NULL))
880  return nil;
881 
882 
883  if (n->Right () != nil)
884  return Minimum (n->Right ());
885 
886  NodePtr next = n->Parent ();
887 
888  NodePtr last = n;
889 
890  while ((next != nil) && (last == next->Right ()))
891  {
892  last = next;
893  next = next->Parent ();
894  }
895 
896  return next;
897 } /* Successor */
898 
899 
900 
901 
902 
903 template <class Entry,class CompareNodes,typename KeyType>
904 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::Predecessor (NodePtr n)
905 {
906  if ((n == nil) || (n == NULL))
907  return nil;
908 
909  if (n->Left () != nil)
910  return Maximum (n->Left ());
911 
912  NodePtr pred = n->Parent ();
913 
914  NodePtr last = n;
915 
916  while ((pred != nil) && (last == pred->Left ()))
917  {
918  last = pred;
919  pred = pred->Parent ();
920  }
921 
922  return pred;
923 } /* Predecessor */
924 
925 
926 
927 
928 
929 
930 template <class Entry,class CompareNodes,typename KeyType>
931 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::Delete (NodePtr z)
932 {
933  NodePtr y;
934  NodePtr x;
935 
936  if (z == curNode)
937  {
938  curNode = Successor (z);
939  if (curNode == nil)
940  curNode = Predecessor (z);
941  }
942 
943  if ((z->Left () == nil) || (z->Right () == nil))
944  {
945  y = z;
946  }
947  else
948  {
949  y = Successor (z);
950  z->Data (y->Data ());
951 
952  if (y == curNode)
953  curNode = z;
954  }
955 
956 
957  if (y->Left () != nil)
958  x = y->Left ();
959  else
960  x = y->Right ();
961 
962  if (x != nil)
963  {
964  x->Parent (y->Parent ());
965  }
966 
967 
968  if (y->Parent () == nil)
969  {
970  root = x;
971  }
972  else
973  {
974  if (y == y->Parent ()->Left ())
975  y->Parent ()->Left (x);
976  else
977  y->Parent ()->Right (x);
978  }
979 
980  size--;
981 
982  return y;
983 } /* Delete */
984 
985 
986 
987 
988 
989 
990 
991 template <class Entry,class CompareNodes,typename KeyType>
992 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::LeftRotate (NodePtr x)
993 {
994  if ((x == nil) || (x == NULL))
995  {
996  std::cerr << std::endl
997  << " ******* ERROR *******" << std::endl
998  << std::endl
999  << "RBTree<Entry,CompareNodes,KeyType>::LeftRotate, Invalid Node." << std::endl
1000  << std::endl;
1001  return x;
1002  }
1003 
1004 
1005  if (x->Right () == nil)
1006  {
1007  // There is no Right Child, So can Not Possibly LeftRotate
1008  std::cerr << std::endl
1009  << " ******* ERROR *******" << std::endl
1010  << std::endl
1011  << "***** RBTree<Entry,CompareNodes,KeyType>::LeftRotate, No right Child ***" << std::endl
1012  << std::endl;
1013  return x;
1014  }
1015 
1016  NodePtr y = x->Right (); // Set Y.
1017 
1018  x->Right (y->Left ()); // Turn y's left Sub-Tree into x's Right sub-tree
1019 
1020  if (y->Left () != nil)
1021  y->Left ()->Parent (x);
1022 
1023  y->Parent (x->Parent ()); // Link X's parent to Y
1024 
1025 
1026  if (x->Parent () == nil)
1027  {
1028  root = y;
1029  }
1030 
1031  else if (x == x->Parent ()->Left ())
1032  {
1033  x->Parent ()->Left (y);
1034  }
1035 
1036  else
1037  {
1038  x->Parent ()->Right (y);
1039  }
1040 
1041 
1042  y->Left (x);
1043  x->Parent (y);
1044 
1045  return y;
1046 } /* LeftRotate */
1047 
1048 
1049 
1050 
1051 template <class Entry,class CompareNodes,typename KeyType>
1052 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::RightRotate (NodePtr x)
1053 {
1054  if ((x == nil) || (x == NULL))
1055  {
1056  cerr << std::endl
1057  << " ******* ERROR *******" << std::endl
1058  << std::endl
1059  << "RBTree<Entry,CompareNodes,KeyType>::RightRotate, Invalid Node." << std::endl
1060  << std::endl;
1061  return x;
1062  }
1063 
1064 
1065  if (x->Left () == nil)
1066  {
1067  // There is no Left Child, So can Not Possibly LeftRotate
1068  cerr << std::endl
1069  << " ******* ERROR *******" << std::endl
1070  << std::endl
1071  << "***** RBTree<Entry,CompareNodes,KeyType>::RightRotate, No Left Child ***" << std::endl
1072  << std::endl;
1073  return x;
1074  }
1075 
1076 
1077  NodePtr y = x->Left (); // Set Y.
1078 
1079  x->Left (y->Right ()); // Turn y's left Sub-Tree into x's Right sub-tree
1080 
1081  if (y->Right () != nil)
1082  y->Right ()->Parent (x);
1083 
1084  y->Parent (x->Parent ()); // Link X's parent to Y //
1085 
1086  if (x->Parent () == nil)
1087  {
1088  root = y;
1089  }
1090 
1091  else if (x == x->Parent ()->Right ())
1092  {
1093  x->Parent ()->Right (y);
1094  }
1095 
1096  else
1097  {
1098  x->Parent ()->Left (y);
1099  }
1100 
1101  y->Right (x);
1102  x->Parent (y);
1103 
1104  return y;
1105 } /* RightRotate */
1106 
1107 
1108 
1109 
1110 template <class Entry,class CompareNodes,typename KeyType>
1111 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::RBInsert (EntryPtr e)
1112 {
1113  NodePtr newNode = Insert (e);
1114 
1115  NodePtr x = newNode;
1116 
1117  NodePtr y = NULL;
1118 
1119  x->Color (RBcolor::Red);
1120 
1121  while ((x != root) && (x->Parent ()->Color () == RBcolor::Red))
1122  {
1123  if (x->Parent () == x->Parent ()->Parent ()->Left ())
1124  {
1125  y = x->Parent ()->Parent ()->Right ();
1126 
1127  if (y->Color () == RBcolor::Red)
1128  {
1129  x->Parent ()->Color (RBcolor::Black); // Case 1
1130  y->Color (RBcolor::Black); // Case 1
1131  x->Parent ()->Parent ()->Color (RBcolor::Red); // Case 1
1132  x = x->Parent ()->Parent (); // Case 1
1133  }
1134 
1135  else
1136  {
1137  if (x == x->Parent ()->Right ())
1138  {
1139  x = x->Parent (); // Case 2
1140  LeftRotate (x); // Case 2
1141  }
1142 
1143  x->Parent ()->Color (RBcolor::Black); // Case 3
1144  x->Parent ()->Parent ()->Color (RBcolor::Red); // Case 3
1145  RightRotate (x->Parent ()->Parent ()); // Case 3
1146  }
1147  }
1148 
1149  else
1150  {
1151  y = x->Parent ()->Parent ()->Left ();
1152 
1153  if (y->Color () == RBcolor::Red)
1154  {
1155  x->Parent ()->Color (RBcolor::Black);
1156  y->Color (RBcolor::Black);
1157  x->Parent ()->Parent ()->Color (RBcolor::Red);
1158  x = x->Parent ()->Parent ();
1159  }
1160 
1161  else
1162  {
1163  if (x == x->Parent ()->Left ())
1164  {
1165  x = x->Parent ();
1166  RightRotate (x);
1167  }
1168 
1169  x->Parent ()->Color (RBcolor::Black);
1170  x->Parent ()->Parent ()->Color (RBcolor::Red);
1171  LeftRotate (x->Parent ()->Parent ());
1172  }
1173  }
1174  }
1175 
1176 
1177  root->Color (RBcolor::Black);
1178  return newNode;
1179 } /* RBInsert */
1180 
1181 
1182 
1183 
1184 
1185 template <class Entry,class CompareNodes,typename KeyType>
1186 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::RBDelete (NodePtr z)
1187 {
1188  if ((z == nil) || (z == NULL))
1189  {
1190  cerr << std::endl
1191  << " ******* ERROR *******" << std::endl
1192  << std::endl
1193  << "***** RBTree<Entry,CompareNodes,KeyType>::RBDelete, No Left Child ***" << std::endl
1194  << std::endl;
1195  return NULL;
1196  }
1197 
1198 
1199  NodePtr x = NULL;
1200  NodePtr y = NULL;
1201 
1202 
1203  if ((z->Left () == nil) || (z->Right () == nil))
1204  y = z;
1205  else
1206  y = Successor (z);
1207 
1208  if (y->Left () != nil)
1209  x = y->Left ();
1210  else
1211  x = y->Right ();
1212 
1213  x->Parent (y->Parent ());
1214 
1215  if (y->Parent () == nil)
1216  root = x;
1217 
1218  else if (y == y->Parent ()->Left ())
1219  y->Parent ()->Left (x);
1220 
1221  else
1222  y->Parent ()->Right (x);
1223 
1224  if (y != z)
1225  {
1226  if (y == curNode)
1227  curNode = z;
1228 
1229  EntryPtr temp = z->Data ();
1230  z->Entry (y->Data ());
1231  y->Entry (temp);
1232  }
1233 
1234  size--;
1235 
1236  if (y->Color () == Black)
1237  {
1238  RBDeleteFixUp (x);
1239  }
1240 
1241  return y;
1242 } /* RBDelete */
1243 
1244 
1245 
1246 
1247 
1248 template <class Entry,class CompareNodes,typename KeyType>
1249 void KKB::RBTree<Entry,CompareNodes,KeyType>::RBDeleteFixUp (NodePtr x)
1250 {
1251  NodePtr w = NULL;
1252  NodePtr deletedNode = x;
1253 
1254  while ((x != root) && (x->Color () == Black))
1255  {
1256  if (x == x->Parent ()->Left ())
1257  {
1258  w = x->Parent ()->Right ();
1259 
1260  if (w->Color () == Red)
1261  {
1262  w->Color (Black); // Case 1
1263  x->Parent ()->Color (Red); // Case 1
1264  LeftRotate (x->Parent ()); // Case 1
1265  w = x->Parent ()->Right (); // Case 1
1266  }
1267 
1268  if ((w->Left ()->Color () == Black)
1269  &&
1270  (w->Right ()->Color () == Black))
1271  {
1272  w->Color (Red); // Case 2
1273  x = x->Parent (); // Case 2
1274  }
1275 
1276  else
1277  {
1278  if (w->Right ()->Color () == Black)
1279  {
1280  w->Left ()->Color (Black); // Case 3
1281  w->Color (Red); // Case 3
1282  RightRotate (w); // Case 3
1283  w = x->Parent ()->Right (); // Case 3
1284  }
1285 
1286  w->Color (x->Parent ()->Color ()); // Case 4
1287  x->Parent ()->Color (Black); // Case 4
1288  w->Right ()->Color (Black); // Case 4
1289  LeftRotate (x->Parent ()); // Case 4
1290  x = root; // Force Termination of Loop. // Case 4
1291  }
1292  }
1293 
1294  else
1295  {
1296  w = x->Parent ()->Left ();
1297 
1298  if (w->Color () == Red)
1299  {
1300  w->Color (Black); // Case 1
1301  x->Parent ()->Color (Red); // Case 1
1302  RightRotate (x->Parent ()); // Case 1
1303  w = x->Parent ()->Left (); // Case 1
1304  }
1305 
1306  if ((w->Right ()->Color () == Black)
1307  &&
1308  (w->Left ()->Color () == Black))
1309  {
1310  w->Color (Red); // Case 2
1311  x = x->Parent (); // Case 2
1312  }
1313 
1314  else
1315  {
1316  if (w->Left ()->Color () == Black)
1317  {
1318  w->Right ()->Color (Black); // Case 3
1319  w->Color (Red); // Case 3
1320  LeftRotate (w); // Case 3
1321  w = x->Parent ()->Left (); // Case 3
1322  }
1323 
1324  w->Color (w->Parent ()->Color ()); // Case 4
1325  x->Parent ()->Color (Black); // Case 4
1326  w->Left ()->Color (Black); // Case 4
1327  RightRotate (x->Parent ()); // Case 4
1328  x = root; // Force Termination of Loop. // Case 4
1329  }
1330  }
1331  }
1332 
1333  x->Color (Black);
1334 
1335  return;;
1336 } /* RBDeleteFixUp */
1337 
1338 
1339 
1340 
1341 
1342 template <class Entry,class CompareNodes,typename KeyType>
1343 void KKB::RBTree<Entry,CompareNodes,KeyType>::WalkTree (NodePtr n)
1344 {
1345  if (n == nil)
1346  return;
1347 
1348  WalkTree (n->Left ());
1349  cout << n->Data ()->ToString () << endl;
1350  WalkTree (n->Right ());
1351 }
1352 
1353 
1354 
1355 
1356 template <class Entry,class CompareNodes,typename KeyType>
1357 KKB::RBnode<Entry>* KKB::RBTree<Entry,CompareNodes,KeyType>::SearchForEntry (NodePtr n,
1358  Entry* e
1359  )
1360 {
1361  // Similar to WalkTree, except will terminate when it finds the node
1362  // that is pointing to "e".
1363  if (n == nil)
1364  return;
1365 
1366  if (n->Data () == e)
1367  return n;
1368 
1369  RBnode<Entry>* nextN = NULL;
1370 
1371  nextN = SearchForEntry (n->Left (), e);
1372  if (!nextN)
1373  nextN = SearchForEntry (n->Right (), e);
1374 
1375  return nextN;
1376 } /* SearchForEntry */
1377 
1378 
1379 
1380 
1381 template <class Entry,class CompareNodes,typename KeyType>
1382 void KKB::RBTree<Entry,CompareNodes,KeyType>::DeleteEntry (Entry* e)
1383 {
1384  RBnode<Entry>* node2Delete = SearchForEntry (root, e);
1385  if (node2Delete)
1386  RBDelete (node2Delete);
1387 } /* DeleteEntry */
1388 
1389 
1390 
1391 
1392 template <class Entry,class CompareNodes,typename KeyType>
1393 void KKB::RBTree<Entry,CompareNodes,KeyType>::CalcTreeStats ()
1394 {
1395  kkint32 numOfLeafs = 0;
1396  kkint32 numOfNodes = 0;
1397  kkint32* leafPaths = new kkint32[size];
1398 
1399  kkint32 shortestPath = INT_MAX;
1400  kkint32 longestPath = INT_MIN;
1401 
1402  CheckNodeStats (root, numOfNodes, numOfLeafs, leafPaths, shortestPath, longestPath, 0);
1403 
1404  kkint32 totalLen = 0;
1405 
1406  for (kkint32 x = 0; x < numOfLeafs; x++)
1407  totalLen += leafPaths[x];
1408 
1409  double avgLen = (double)totalLen / (double)numOfLeafs;
1410 
1411  std::cout << std::endl
1412  << "Number of Nodes [" << numOfNodes << "]" << std::endl
1413  << "Number of Leafs [" << numOfLeafs << "]" << std::endl
1414  << "Shortest Path [" << shortestPath << "]" << std::endl
1415  << "Longest Path [" << longestPath << "]" << std::endl
1416  << "Average Length [" << avgLen << "]" << std::endl;
1417 }
1418 
1419 
1420 
1421 
1422 template <class Entry,class CompareNodes,typename KeyType>
1423 void KKB::RBTree<Entry,CompareNodes,KeyType>::CheckNodeStats (NodePtr n,
1424  kkint32& numOfNodes,
1425  kkint32& numOfLeafs,
1426  kkint32* leafPaths,
1427  kkint32& shortestPath,
1428  kkint32& longestPath,
1429  kkint32 curDeapth
1430  )
1431 
1432 {
1433  if (n == nil)
1434  return;
1435 
1436  numOfNodes++;
1437 
1438  curDeapth++;
1439 
1440  if ((n->Left () == nil) && (n->Right () == nil))
1441  {
1442  // We have a Leaf
1443  leafPaths[numOfLeafs] = curDeapth;
1444 
1445  if (curDeapth < shortestPath)
1446  shortestPath = curDeapth;
1447 
1448  if (curDeapth > longestPath)
1449  longestPath = curDeapth;
1450 
1451  numOfLeafs++;
1452 
1453  return;
1454  }
1455 
1456 
1457  if (n->Left () != nil)
1458  CheckNodeStats (n->Left (),
1459  numOfNodes,
1460  numOfLeafs,
1461  leafPaths,
1462  shortestPath,
1463  longestPath,
1464  curDeapth
1465  );
1466 
1467 
1468  if (n->Right () != nil)
1469  CheckNodeStats (n->Right (),
1470  numOfNodes,
1471  numOfLeafs,
1472  leafPaths,
1473  shortestPath,
1474  longestPath,
1475  curDeapth
1476  );
1477 } /* CheckNodeStats */
1478 
1479 
1480 
1481 
1482 template <class Entry,class CompareNodes,typename KeyType>
1483 bool KKB::RBTree<Entry,CompareNodes,KeyType>::Validate ()
1484 {
1485  kkint32 blackNodeHeight = -1;
1486 
1487  kkint32 numOfNodes = ValidateSubTree (root, nil, "Root", 0, blackNodeHeight);
1488 
1489  if (numOfNodes != size)
1490  {
1491  std::cerr << std::endl
1492  << "*** ERROR *** NumOfNodes[" << numOfNodes << "] Does not add up to size[" << size << "]." << std::endl;
1493  return false;
1494  }
1495 
1496  return true;
1497 }
1498 
1499 
1500 template <class Entry,class CompareNodes,typename KeyType>
1501 kkint32 KKB::RBTree<Entry,CompareNodes,KeyType>::ValidateSubTree (NodePtr subTree,
1502  NodePtr theParent,
1503  const char* linkDescription,
1504  kkint32 blackNodeCount,
1505  kkint32& blackNodeHeight
1506  )
1507 {
1508  kkint32 numOfNodes = 0;
1509 
1510 
1511  if (subTree->Color () == Black)
1512  blackNodeCount++;
1513 
1514 
1515  if (subTree == nil)
1516  {
1517  if (blackNodeHeight < 0)
1518  {
1519  blackNodeHeight = blackNodeCount;
1520  }
1521  else
1522  {
1523  if (blackNodeCount != blackNodeHeight)
1524  {
1525  std::cerr << std::endl
1526  << "*** ERROR ***" << std::endl
1527  << std::endl
1528  << "ValidateSubTree, Not all Leafs have Same Height" << std::endl
1529  << " firstHeight[" << blackNodeHeight << "] "
1530  << "This Leaf[" << blackNodeCount << "]"
1531  << std::endl
1532  << std::endl;
1533  }
1534  }
1535 
1536  return 0;
1537  }
1538 
1539  numOfNodes++;
1540 
1541  if (subTree->Parent () != theParent)
1542  {
1543  std::cerr << std::endl;
1544  std::cerr << "*** ERROR *** Node[" << subTree->Data ()->ToString ()
1545  << "] Child[" << linkDescription << "]"
1546  << " not Pointing to Its Parent["
1547  << theParent->Data ()->ToString ()
1548  << "]."
1549  << std::endl;
1550  cerr << std::endl;
1551 
1552  return numOfNodes;
1553  }
1554 
1555  numOfNodes += ValidateSubTree (subTree->Left (), subTree, "Left", blackNodeCount, blackNodeHeight);
1556  numOfNodes += ValidateSubTree (subTree->Right (), subTree, "Right", blackNodeCount, blackNodeHeight);
1557 
1558  return numOfNodes;
1559 } /* ValidateSubTree */
1560 
1561 
1562 
1563 
1564 
1565 
1566 template <class Entry,class CompareNodes,typename KeyType>
1567 kkint32 KKB::RBTree<Entry,CompareNodes,KeyType>::CountNodesInSubTree (NodePtr subTree)
1568 {
1569  if (subTree == nil)
1570  return 0;
1571 
1572  return 1 + CountNodesInSubTree (subTree->Left ())
1573  + CountNodesInSubTree (subTree->Right ());
1574 }
1575 
1576 
1577 
1578 
1579 
1580 template <class Entry,class CompareNodes,typename KeyType>
1581 void KKB::RBTree<Entry,CompareNodes,KeyType>::IteratorDelete (IteratorPtr deletedIterator)
1582 {
1583  if (numOfIterators < 1)
1584  return;
1585 
1586 
1587  if (numOfIterators == 1)
1588  {
1589  delete iterators;
1590  iterators = NULL;
1591  numOfIterators = 0;
1592  return;
1593  }
1594 
1595 
1596  numOfIterators--;
1597  IteratorPtr* newIterators = new IteratorPtr[numOfIterators];
1598 
1599  kkint32 j = 0;
1600  for (kkint32 i = 0; i <= numOfIterators; i++)
1601  {
1602  if (iterators[i] != deletedIterator)
1603  {
1604  newIterators[j] = iterators[i];
1605  j++;
1606  }
1607  }
1608 
1609  delete iterators;
1610  iterators = newIterators;
1611 } /* IteratorDelete */
1612 
1613 
1614 
1615 
1616 
1617 template <class Entry,class CompareNodes,typename KeyType>
1618 void KKB::RBTree<Entry,CompareNodes,KeyType>::IteratorAdd (IteratorPtr newIterator)
1619 {
1620  IteratorPtr* newIterators = new IteratorPtr[numOfIterators + 1];
1621 
1622  for (kkint32 i = 0; i < numOfIterators; i++)
1623  {
1624  newIterators[i] = iterators[i];
1625  }
1626 
1627  newIterators[numOfIterators] = newIterator;
1628  numOfIterators++;
1629 
1630  if (iterators != NULL)
1631  delete iterators;
1632 
1633  iterators = newIterators;
1634 } /* IteratorAdd */
1635 
1636 
1637 
1638 
1639 
1640 template <class Entry,class CompareNodes,typename KeyType>
1641 KKB::Iterator<Entry,CompareNodes,KeyType>::Iterator (TreePtr _tree)
1642 {
1643  tree = _tree;
1644 
1645  prevNode = tree->nil;
1646  curNode = tree->nil;
1647  nextNode = tree->Minimum ();
1648 
1649  tree->IteratorAdd (this);
1650 }
1651 
1652 
1653 
1654 template <class Entry,class CompareNodes,typename KeyType>
1655 KKB::Iterator<Entry,CompareNodes,KeyType>::~Iterator ()
1656 {
1657  if (tree)
1658  tree->IteratorDelete (this);
1659 }
1660 
1661 
1662 
1663 
1664 template <class Entry,class CompareNodes,typename KeyType>
1665 void KKB::Iterator<Entry,CompareNodes,KeyType>::IsTreeStillThere ()
1666 {
1667  if (tree == NULL)
1668  {
1669  std::cerr << std::endl
1670  << "*** ERROR ***" << std::endl
1671  << std::endl
1672  << "*** RBTree<Entry,CompareNodes,KeyType>::Iterator::IsTreeStillThere ***" << std::endl
1673  << std::endl
1674  << "Tree is no longer available" << std::endl
1675  << std::endl;
1676  exit (-1);
1677  }
1678 } /* IsTreeStillThere */
1679 
1680 
1681 
1682 
1683 template <class Entry,class CompareNodes,typename KeyType>
1684 Entry* KKB::Iterator<Entry,CompareNodes,KeyType>::GetEqual (const KeyType& key)
1685 {
1686  IsTreeStillThere ();
1687 
1688  curNode = tree->GetEqual (tree->root, key);
1689 
1690  if (curNode == tree.nil)
1691  {
1692  nextNode = tree->GetGreater (tree->root, key);
1693  if (nextNode == tree.nil)
1694  prevNode = tree->GetLess (tree->root, key);
1695 
1696  else
1697  prevNode = tree->Predecessor (nextNode);
1698 
1699  return NULL;
1700  }
1701 
1702 
1703  prevNode = tree->Predecessor (curNode);
1704  nextNode = tree->Successor (curNode);
1705 
1706  return curNode->Data ();
1707 }
1708 
1709 
1710 
1711 
1712 template <class Entry,class CompareNodes,typename KeyType>
1713 Entry* KKB::Iterator<Entry,CompareNodes,KeyType>::GetGreater (const KeyType& key)
1714 {
1715  IsTreeStillThere ();
1716 
1717  curNode = tree->GetGreater (tree->root, key);
1718 
1719  if (curNode == tree->nil)
1720  {
1721  nextNode = tree->nil;
1722  prevNode = tree->Maximum (tree->root);
1723  }
1724 
1725  else
1726  {
1727  nextNode = tree->Successor (curNode);
1728  prevNode = tree->Predecessor (curNode);
1729  }
1730 
1731  return curNode->Data ();
1732 } /* Iterator::GetGreater */
1733 
1734 
1735 
1736 
1737 template <class Entry,class CompareNodes,typename KeyType>
1738 Entry* KKB::Iterator<Entry,CompareNodes,KeyType>::GetGreaterOrEqual (const KeyType& key)
1739 {
1740  IsTreeStillThere ();
1741 
1742  curNode = tree->GetGreaterOrEqual (tree->root, key);
1743 
1744  if (curNode == tree->nil)
1745  {
1746  nextNode = tree->nil;
1747  prevNode = tree->Maximum (tree->root);
1748  }
1749 
1750  else
1751  {
1752  nextNode = tree->Successor (tree.curMode);
1753  prevNode = tree->Predecessor (tree.curNode);
1754  }
1755 
1756  return curNode->Data ();
1757 } /* Iterator::GetGreaterOrEqual */
1758 
1759 
1760 
1761 
1762 
1763 
1764 template <class Entry,class CompareNodes,typename KeyType>
1765 Entry* KKB::Iterator<Entry,CompareNodes,KeyType>::GetFirst ()
1766 {
1767  IsTreeStillThere ();
1768 
1769  prevNode = tree->nil;
1770  curNode = tree->Minimum ();
1771  nextNode = tree->Successor (curNode);
1772 
1773  return curNode->Data ();
1774 }
1775 
1776 
1777 
1778 
1779 template <class Entry,class CompareNodes,typename KeyType>
1780 Entry* KKB::Iterator<Entry,CompareNodes,KeyType>::GetLast ()
1781 {
1782  IsTreeStillThere ();
1783 
1784  curNode = tree->Maximum ();
1785  prevNode = tree->Predecessor (curNode);
1786  nextNode = tree->nil;
1787 
1788  return curNode->Data ();
1789 }
1790 
1791 
1792 
1793 
1794 template <class Entry,class CompareNodes,typename KeyType>
1795 Entry* KKB::Iterator<Entry,CompareNodes,KeyType>::GetNext ()
1796 {
1797  IsTreeStillThere ();
1798 
1799 
1800  if (nextNode == tree->nil)
1801  {
1802  return NULL;
1803  }
1804 
1805  prevNode = curNode;
1806  curNode = nextNode;
1807 
1808  if (prevNode == tree->nil)
1809  {
1810  prevNode = tree->Predecessor (curNode);
1811  }
1812 
1813  nextNode = tree->Successor (curNode);
1814 
1815  return curNode->Data ();
1816 }
1817 
1818 
1819 
1820 
1821 template <class Entry,class CompareNodes,typename KeyType>
1822 Entry* KKB::Iterator<Entry,CompareNodes,KeyType>::GetPrev ()
1823 {
1824  IsTreeStillThere ();
1825 
1826  if (prevNode == tree->nil)
1827  {
1828  return NULL;
1829  }
1830 
1831  nextNode = curNode;
1832  curNode = prevNode;
1833 
1834  if (nextNode == tree->nil)
1835  {
1836  prevNode = tree->Successor (curNode);
1837  }
1838 
1839  prevNode = tree->Predecessor (curNode);
1840 
1841  return curNode->Data ();
1842 }
1843 
1844 
1845 
1846 
1847 template <class Entry,class CompareNodes,typename KeyType>
1848 void KKB::Iterator<Entry,CompareNodes,KeyType>::TreeHasBeenDeleted ()
1849 {
1850  // Called by RBTree object to let iterators know that the tree they are
1851  // Iterating is been deleted.
1852  tree = NULL;
1853 
1854  curNode = prevNode = nextNode = NULL;
1855 }
1856 
1857 
1858 
1859 
1860 template <class Entry,class CompareNodes,typename KeyType>
1861 void KKB::Iterator<Entry,CompareNodes,KeyType>::DeletionOfNode (NodePtr n)
1862 {
1863  // Called by RBTree object to let iterators know that a k=node has been deleted
1864  // and this way they can make the appropriate adjustments to the next, prev, and
1865  // curt node pointers.
1866 
1867  if (n == prevNode)
1868  {
1869  if (prevNode != tree->nil)
1870  prevNode = tree->Predecessor (prevNode);
1871 
1872  return;
1873  }
1874 
1875  if (n == curNode)
1876  {
1877  curNode = tree->nil;
1878  return;
1879  }
1880 
1881  if (n == nextNode)
1882  {
1883  nextNode = tree->Successor (nextNode);
1884  }
1885 } /* DeletionOfNode */
1886 
1887 
1888 
1889 template <class Entry,class CompareNodes,typename KeyType>
1890 void KKB::Iterator<Entry,CompareNodes,KeyType>::InsertionOfNode (NodePtr n)
1891 {
1892 }
1893 
1894 
1895 #endif
bool CompareToTree(TreePtr tree)
Definition: RBTree.h:409
RBnode(RBnodePtr _parent, RBnodePtr _left, RBnodePtr _right, RBcolor _color, EntryPtr _entry)
Definition: RBTree.h:281
EntryPtr GetLast()
Definition: RBTree.h:1780
Iterator(TreePtr _tree)
Definition: RBTree.h:1641
void Right(RBnodePtr _right)
Definition: RBTree.h:57
EntryPtr GetNext()
Definition: RBTree.h:164
__int32 kkint32
Definition: KKBaseTypes.h:88
kkuint32 Size()
Definition: RBTree.h:140
EntryPtr GetLess(const KeyType &key)
Definition: RBTree.h:669
EntryPtr GetGreater(const KeyType &key)
Definition: RBTree.h:598
RBTree< Entry, CompareNodes, KeyType > * TreePtr
Definition: RBTree.h:75
void Data(EntryPtr _data)
Definition: RBTree.h:54
void CalcTreeStats()
Definition: RBTree.h:1393
Node * NodePtr
Definition: RBTree.h:124
RBcolor
Definition: RBTree.h:30
EntryPtr GetGreaterOrEqual(const KeyType &key)
Definition: RBTree.h:608
RBnodePtr Right()
Definition: RBTree.h:51
void DeleteCurrentNode()
Definition: RBTree.h:718
void WalkTree()
Definition: RBTree.h:142
EntryPtr Data()
Definition: RBTree.h:48
Iterator< Entry, CompareNodes, KeyType > * IteratorPtr
Definition: RBTree.h:176
RBTree(CompareNodes &_comparator, bool _owner)
Definition: RBTree.h:298
Entry * EntryPtr
Definition: RBTree.h:77
unsigned __int32 kkuint32
Definition: KKBaseTypes.h:89
EntryPtr GetFirst()
Definition: RBTree.h:1765
void DeleteEntry(EntryPtr e)
Definition: RBTree.h:1382
RBcolor Color()
Definition: RBTree.h:47
RBnode< Entry > * NodePtr
Definition: RBTree.h:79
KKTHread * KKTHreadPtr
Tree * TreePtr
Definition: RBTree.h:128
void Parent(RBnodePtr _parent)
Definition: RBTree.h:56
void Left(RBnodePtr _left)
Definition: RBTree.h:55
EntryPtr GetNext()
Definition: RBTree.h:1795
EntryPtr GetEqual(const KeyType &key)
Definition: RBTree.h:1684
Entry * EntryPtr
Definition: RBTree.h:122
EntryPtr GetEqual(const KeyType &key)
Definition: RBTree.h:493
EntryPtr Successor()
Definition: RBTree.h:700
RBnode< Entry > Node
Definition: RBTree.h:123
RBTree(RBTree &tree)
Definition: RBTree.h:319
EntryPtr GetPrev()
Definition: RBTree.h:166
friend std::ostream & operator<<(std::ostream &os, const Matrix &matrix)
NodePtr RBInsert(EntryPtr e)
Definition: RBTree.h:1111
RBnodePtr Left()
Definition: RBTree.h:49
EntryPtr GetGreater(const KeyType &key)
Definition: RBTree.h:1713
RBTree< Entry, CompareNodes, KeyType > Tree
Definition: RBTree.h:126
bool Validate()
Definition: RBTree.h:1483
EntryPtr GetLast()
Definition: RBTree.h:776
EntryPtr GetPrev()
Definition: RBTree.h:1822
EntryPtr Predecessor()
Definition: RBTree.h:682
EntryPtr GetGreaterOrEqual(const KeyType &key)
Definition: RBTree.h:1738
#define INT_MAX
Adapted by Kurt Kramer be a &#39;class&#39; definition so as to make it more usable in th ePices software wor...
Definition: UsfCasCor.h:186
void Color(RBcolor _color)
Definition: RBTree.h:53
EntryPtr GetFirst()
Definition: RBTree.h:763
RBnodePtr Parent()
Definition: RBTree.h:50