32 template <
class Entry>
35 typedef Entry* EntryPtr;
68 template <
class Entry,
class CompareNodes,
typename KeyType>
71 template <
class Entry,
class CompareNodes,
typename KeyType>
75 typedef RBTree<Entry,CompareNodes,KeyType>*
TreePtr;
102 void IsTreeStillThere ();
104 void TreeHasBeenDeleted ();
106 void DeletionOfNode (
NodePtr n);
108 void InsertionOfNode (
NodePtr n);
118 template <
class Entry,
class CompareNodes,
typename KeyType>
126 typedef RBTree<Entry,CompareNodes,KeyType>
Tree;
132 RBTree (CompareNodes& _comparator,
179 void CheckNodeStats (
NodePtr n,
193 bool AreSubTreesTheSame (
NodePtr n1,
203 void DeleteSubTree (
NodePtr treeRoot);
231 NodePtr Minimum () {
return Minimum (root);}
239 void RBDeleteFixUp (
NodePtr x);
251 const char* linkDescription,
258 CompareNodes& comparator;
280 template <
class Entry>
297 template <
class Entry,
class CompareNodes,
typename KeyType>
298 KKB::RBTree<Entry,CompareNodes,KeyType>::
RBTree (CompareNodes& _comparator,
301 comparator (_comparator),
310 nil =
new RBnode<Entry> (NULL, NULL, NULL, RBcolor::Black, NULL);
318 template <
class Entry,
class CompareNodes,
typename KeyType>
319 KKB::RBTree<Entry,CompareNodes,KeyType>::
RBTree (RBTree& tree):
321 comparator (tree.comparator),
329 nil =
new RBnode<Entry> (NULL, NULL, NULL, Black, NULL);
330 root = CloneSubTree (tree.root, tree.nil, nil);
332 kkint32 x = CountNodesInSubTree (root);
340 template <
class Entry,
class CompareNodes,
typename KeyType>
349 EntryPtr entry =
new Entry (*(s->Data ()));
351 NodePtr newNode =
new Node (dParent,
358 NodePtr leftSubTree = CloneSubTree (s->Left (), sNil, newNode);
359 NodePtr rightSubTree = CloneSubTree (s->Right (), sNil, newNode);
361 newNode->Left (leftSubTree);
362 newNode->Right (rightSubTree);
369 template <
class Entry,
class CompareNodes,
typename KeyType>
373 DeleteSubTree (root);
376 for (kkint32 i = 0; i < numOfIterators; i++)
378 iterators[i]->TreeHasBeenDeleted ();
387 template <
class Entry,
class CompareNodes,
typename KeyType>
388 void KKB::RBTree<Entry,CompareNodes,KeyType>::DeleteSubTree (
NodePtr treeRoot)
393 if (treeRoot->Left () != nil)
394 DeleteSubTree (treeRoot->Left ());
396 if (treeRoot->Right () != nil)
397 DeleteSubTree (treeRoot->Right ());
400 delete treeRoot->Data ();
408 template <
class Entry,
class CompareNodes,
typename KeyType>
411 return AreSubTreesTheSame (root, nil, tree->root, tree->nil);
417 template <
class Entry,
class CompareNodes,
typename KeyType>
418 bool KKB::RBTree<Entry,CompareNodes,KeyType>::AreSubTreesTheSame (
NodePtr n1,
424 if ((n1 == n1NIL) && (n2 == n2NIL))
427 if ((n1 == n1NIL) || (n2 == n2NIL))
431 if (*(n1->Data ()) == *(n2->Data ()))
433 if (!AreSubTreesTheSame (n1->Left (), n1NIL, n2->Left (), n2NIL))
436 if (!AreSubTreesTheSame (n1->Right (), n1NIL, n2->Right (), n2NIL))
450 template <
class Entry,
class CompareNodes,
typename KeyType>
462 NodePtr lastEqual = nil;
466 const KeyType& nodeKey = comparator.ExtractKey (n->Data ());
473 else if (key > nodeKey)
492 template <
class Entry,
class CompareNodes,
typename KeyType>
493 Entry*
KKB::RBTree<Entry,CompareNodes,KeyType>::
GetEqual (
const KeyType& key)
495 curNode = GetEqual (root, key);
500 return curNode->Data ();
507 template <
class Entry,
class CompareNodes,
typename KeyType>
512 if ((subTree == nil) || (subTree == NULL))
516 NodePtr lastGreater = nil;
522 KeyType nodeKey = comparator.ExtractKey (n->Data ());
536 if (lastGreater == nil)
542 curNode = lastGreater;
551 template <
class Entry,
class CompareNodes,
typename KeyType>
552 KKB::
RBnode<Entry>*
KKB::RBTree<Entry,CompareNodes,KeyType>::GetGreaterOrEqual (
NodePtr subTree,
556 if ((subTree == nil) || (subTree == NULL))
560 NodePtr lastGreater = nil;
566 KeyType nodeKey = comparator.ExtractKey (n->Data ());
580 if (lastGreater == nil)
586 curNode = lastGreater;
597 template <
class Entry,
class CompareNodes,
typename KeyType>
598 Entry*
KKB::RBTree<Entry,CompareNodes,KeyType>::
GetGreater (
const KeyType& key)
600 curNode = GetGreater (root, key);
601 return curNode->Data ();
607 template <
class Entry,
class CompareNodes,
typename KeyType>
610 curNode = GetGreaterOrEqual (root, key);
611 return curNode->Data ();
617 template <
class Entry,
class CompareNodes,
typename KeyType>
622 if ((subTree == nil) || (subTree == NULL))
626 NodePtr lastLess = nil;
634 KeyType nodeKey = comparator.ExtractKey (n->Data ());
655 while ((n != nil) && (comparator.ExtractKey (n) < key))
668 template <
class Entry,
class CompareNodes,
typename KeyType>
669 Entry*
KKB::RBTree<Entry,CompareNodes,KeyType>::
GetLess (
const KeyType& key)
671 curNode = GetLess (root, key);
672 return curNode->Data ();
681 template <
class Entry,
class CompareNodes,
typename KeyType>
684 if ((curNode == nil) || (curNode == NULL))
687 curNode = Predecessor (curNode);
689 if ((curNode == nil) || (curNode == NULL))
692 return curNode->Data ();
699 template <
class Entry,
class CompareNodes,
typename KeyType>
702 if ((curNode == nil) || (curNode == NULL))
705 curNode = Successor (curNode);
707 if ((curNode == nil) || (curNode == NULL))
710 return curNode->Data ();
717 template <
class Entry,
class CompareNodes,
typename KeyType>
720 if ((curNode == nil) || (curNode == NULL))
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;
731 EntryPtr entry2Delete = curNode->Data ();
733 NodePtr node2Delete = curNode;
735 curNode = Predecessor (node2Delete);
736 if ((curNode == nil) || (curNode == NULL))
737 curNode = Successor (node2Delete);
740 NodePtr deletedNode = RBDelete (node2Delete);
742 if (deletedNode->Data () != entry2Delete)
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;
753 delete deletedNode->Data ();
762 template <
class Entry,
class CompareNodes,
typename KeyType>
768 curNode = Minimum ();
769 return curNode->Data ();
775 template <
class Entry,
class CompareNodes,
typename KeyType>
781 curNode = Maximum ();
782 return curNode->Data ();
789 template <
class Entry,
class CompareNodes,
typename KeyType>
792 NodePtr newNode = NULL;
794 const KeyType& newKey = comparator.ExtractKey (_entry);
798 newNode =
new RBnode<Entry> (nil, nil, nil, RBcolor::Red, _entry);
806 kkint32 lastBranch = 0;
812 const KeyType& nextKey = comparator.ExtractKey (next->Data ());
814 if (newKey < nextKey)
817 next = next->Left ();
822 next = next->Right ();
826 newNode =
new RBnode<Entry> (last, nil, nil, RBcolor::Red, _entry);
830 last->Left (newNode);
834 last->Right (newNode);
849 template <
class Entry,
class CompareNodes,
typename KeyType>
852 while (n->Left () != nil)
862 template <
class Entry,
class CompareNodes,
typename KeyType>
865 while (n->Right () != nil)
876 template <
class Entry,
class CompareNodes,
typename KeyType>
879 if ((n == nil) || (n == NULL))
883 if (n->Right () != nil)
884 return Minimum (n->Right ());
886 NodePtr next = n->Parent ();
890 while ((next != nil) && (last == next->Right ()))
893 next = next->Parent ();
903 template <
class Entry,
class CompareNodes,
typename KeyType>
906 if ((n == nil) || (n == NULL))
909 if (n->Left () != nil)
910 return Maximum (n->Left ());
912 NodePtr pred = n->Parent ();
916 while ((pred != nil) && (last == pred->Left ()))
919 pred = pred->Parent ();
930 template <
class Entry,
class CompareNodes,
typename KeyType>
938 curNode = Successor (z);
940 curNode = Predecessor (z);
943 if ((z->Left () == nil) || (z->Right () == nil))
950 z->Data (y->Data ());
957 if (y->Left () != nil)
964 x->Parent (y->Parent ());
968 if (y->Parent () == nil)
974 if (y == y->Parent ()->Left ())
975 y->Parent ()->Left (x);
977 y->Parent ()->Right (x);
991 template <
class Entry,
class CompareNodes,
typename KeyType>
994 if ((x == nil) || (x == NULL))
996 std::cerr << std::endl
997 <<
" ******* ERROR *******" << std::endl
999 <<
"RBTree<Entry,CompareNodes,KeyType>::LeftRotate, Invalid Node." << std::endl
1005 if (x->Right () == nil)
1008 std::cerr << std::endl
1009 <<
" ******* ERROR *******" << std::endl
1011 <<
"***** RBTree<Entry,CompareNodes,KeyType>::LeftRotate, No right Child ***" << std::endl
1016 NodePtr y = x->Right ();
1018 x->Right (y->Left ());
1020 if (y->Left () != nil)
1021 y->Left ()->Parent (x);
1023 y->Parent (x->Parent ());
1026 if (x->Parent () == nil)
1031 else if (x == x->Parent ()->Left ())
1033 x->Parent ()->Left (y);
1038 x->Parent ()->Right (y);
1051 template <
class Entry,
class CompareNodes,
typename KeyType>
1054 if ((x == nil) || (x == NULL))
1057 <<
" ******* ERROR *******" << std::endl
1059 <<
"RBTree<Entry,CompareNodes,KeyType>::RightRotate, Invalid Node." << std::endl
1065 if (x->Left () == nil)
1069 <<
" ******* ERROR *******" << std::endl
1071 <<
"***** RBTree<Entry,CompareNodes,KeyType>::RightRotate, No Left Child ***" << std::endl
1077 NodePtr y = x->Left ();
1079 x->Left (y->Right ());
1081 if (y->Right () != nil)
1082 y->Right ()->Parent (x);
1084 y->Parent (x->Parent ());
1086 if (x->Parent () == nil)
1091 else if (x == x->Parent ()->Right ())
1093 x->Parent ()->Right (y);
1098 x->Parent ()->Left (y);
1110 template <
class Entry,
class CompareNodes,
typename KeyType>
1113 NodePtr newNode = Insert (e);
1115 NodePtr x = newNode;
1119 x->Color (RBcolor::Red);
1121 while ((x != root) && (x->Parent ()->Color () == RBcolor::Red))
1123 if (x->Parent () == x->Parent ()->Parent ()->Left ())
1125 y = x->Parent ()->Parent ()->Right ();
1127 if (y->Color () == RBcolor::Red)
1129 x->Parent ()->Color (RBcolor::Black);
1130 y->Color (RBcolor::Black);
1131 x->Parent ()->Parent ()->Color (RBcolor::Red);
1132 x = x->Parent ()->Parent ();
1137 if (x == x->Parent ()->Right ())
1143 x->Parent ()->Color (RBcolor::Black);
1144 x->Parent ()->Parent ()->Color (RBcolor::Red);
1145 RightRotate (x->Parent ()->Parent ());
1151 y = x->Parent ()->Parent ()->Left ();
1153 if (y->Color () == RBcolor::Red)
1155 x->Parent ()->Color (RBcolor::Black);
1156 y->Color (RBcolor::Black);
1157 x->Parent ()->Parent ()->Color (RBcolor::Red);
1158 x = x->Parent ()->Parent ();
1163 if (x == x->Parent ()->Left ())
1169 x->Parent ()->Color (RBcolor::Black);
1170 x->Parent ()->Parent ()->Color (RBcolor::Red);
1171 LeftRotate (x->Parent ()->Parent ());
1177 root->Color (RBcolor::Black);
1185 template <
class Entry,
class CompareNodes,
typename KeyType>
1188 if ((z == nil) || (z == NULL))
1191 <<
" ******* ERROR *******" << std::endl
1193 <<
"***** RBTree<Entry,CompareNodes,KeyType>::RBDelete, No Left Child ***" << std::endl
1203 if ((z->Left () == nil) || (z->Right () == nil))
1208 if (y->Left () != nil)
1213 x->Parent (y->Parent ());
1215 if (y->Parent () == nil)
1218 else if (y == y->Parent ()->Left ())
1219 y->Parent ()->Left (x);
1222 y->Parent ()->Right (x);
1229 EntryPtr temp = z->Data ();
1230 z->Entry (y->Data ());
1236 if (y->Color () == Black)
1248 template <
class Entry,
class CompareNodes,
typename KeyType>
1249 void KKB::RBTree<Entry,CompareNodes,KeyType>::RBDeleteFixUp (
NodePtr x)
1252 NodePtr deletedNode = x;
1254 while ((x != root) && (x->Color () == Black))
1256 if (x == x->Parent ()->Left ())
1258 w = x->Parent ()->Right ();
1260 if (w->Color () == Red)
1263 x->Parent ()->Color (Red);
1264 LeftRotate (x->Parent ());
1265 w = x->Parent ()->Right ();
1268 if ((w->Left ()->Color () == Black)
1270 (w->Right ()->Color () == Black))
1278 if (w->Right ()->Color () == Black)
1280 w->Left ()->Color (Black);
1283 w = x->Parent ()->Right ();
1286 w->Color (x->Parent ()->Color ());
1287 x->Parent ()->Color (Black);
1288 w->Right ()->Color (Black);
1289 LeftRotate (x->Parent ());
1296 w = x->Parent ()->Left ();
1298 if (w->Color () == Red)
1301 x->Parent ()->Color (Red);
1302 RightRotate (x->Parent ());
1303 w = x->Parent ()->Left ();
1306 if ((w->Right ()->Color () == Black)
1308 (w->Left ()->Color () == Black))
1316 if (w->Left ()->Color () == Black)
1318 w->Right ()->Color (Black);
1321 w = x->Parent ()->Left ();
1324 w->Color (w->Parent ()->Color ());
1325 x->Parent ()->Color (Black);
1326 w->Left ()->Color (Black);
1327 RightRotate (x->Parent ());
1342 template <
class Entry,
class CompareNodes,
typename KeyType>
1343 void KKB::RBTree<Entry,CompareNodes,KeyType>::WalkTree (
NodePtr n)
1348 WalkTree (n->Left ());
1349 cout << n->Data ()->ToString () << endl;
1350 WalkTree (n->Right ());
1356 template <
class Entry,
class CompareNodes,
typename KeyType>
1366 if (n->Data () == e)
1369 RBnode<Entry>* nextN = NULL;
1371 nextN = SearchForEntry (n->Left (), e);
1373 nextN = SearchForEntry (n->Right (), e);
1381 template <
class Entry,
class CompareNodes,
typename KeyType>
1384 RBnode<Entry>* node2Delete = SearchForEntry (root, e);
1386 RBDelete (node2Delete);
1392 template <
class Entry,
class CompareNodes,
typename KeyType>
1395 kkint32 numOfLeafs = 0;
1396 kkint32 numOfNodes = 0;
1397 kkint32* leafPaths =
new kkint32[size];
1399 kkint32 shortestPath =
INT_MAX;
1400 kkint32 longestPath = INT_MIN;
1402 CheckNodeStats (root, numOfNodes, numOfLeafs, leafPaths, shortestPath, longestPath, 0);
1404 kkint32 totalLen = 0;
1406 for (kkint32 x = 0; x < numOfLeafs; x++)
1407 totalLen += leafPaths[x];
1409 double avgLen = (
double)totalLen / (
double)numOfLeafs;
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;
1422 template <
class Entry,
class CompareNodes,
typename KeyType>
1423 void KKB::RBTree<Entry,CompareNodes,KeyType>::CheckNodeStats (
NodePtr n,
1440 if ((n->Left () == nil) && (n->Right () == nil))
1443 leafPaths[numOfLeafs] = curDeapth;
1445 if (curDeapth < shortestPath)
1446 shortestPath = curDeapth;
1448 if (curDeapth > longestPath)
1449 longestPath = curDeapth;
1457 if (n->Left () != nil)
1458 CheckNodeStats (n->Left (),
1468 if (n->Right () != nil)
1469 CheckNodeStats (n->Right (),
1482 template <
class Entry,
class CompareNodes,
typename KeyType>
1485 kkint32 blackNodeHeight = -1;
1487 kkint32 numOfNodes = ValidateSubTree (root, nil,
"Root", 0, blackNodeHeight);
1489 if (numOfNodes != size)
1491 std::cerr << std::endl
1492 <<
"*** ERROR *** NumOfNodes[" << numOfNodes <<
"] Does not add up to size[" << size <<
"]." << std::endl;
1500 template <
class Entry,
class CompareNodes,
typename KeyType>
1501 kkint32 KKB::RBTree<Entry,CompareNodes,KeyType>::ValidateSubTree (
NodePtr subTree,
1503 const char* linkDescription,
1508 kkint32 numOfNodes = 0;
1511 if (subTree->Color () == Black)
1517 if (blackNodeHeight < 0)
1519 blackNodeHeight = blackNodeCount;
1523 if (blackNodeCount != blackNodeHeight)
1525 std::cerr << std::endl
1526 <<
"*** ERROR ***" << std::endl
1528 <<
"ValidateSubTree, Not all Leafs have Same Height" << std::endl
1529 <<
" firstHeight[" << blackNodeHeight <<
"] " 1530 <<
"This Leaf[" << blackNodeCount <<
"]" 1541 if (subTree->Parent () != theParent)
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 ()
1555 numOfNodes += ValidateSubTree (subTree->Left (), subTree,
"Left", blackNodeCount, blackNodeHeight);
1556 numOfNodes += ValidateSubTree (subTree->Right (), subTree,
"Right", blackNodeCount, blackNodeHeight);
1566 template <
class Entry,
class CompareNodes,
typename KeyType>
1567 kkint32 KKB::RBTree<Entry,CompareNodes,KeyType>::CountNodesInSubTree (
NodePtr subTree)
1572 return 1 + CountNodesInSubTree (subTree->Left ())
1573 + CountNodesInSubTree (subTree->Right ());
1580 template <
class Entry,
class CompareNodes,
typename KeyType>
1581 void KKB::RBTree<Entry,CompareNodes,KeyType>::IteratorDelete (
IteratorPtr deletedIterator)
1583 if (numOfIterators < 1)
1587 if (numOfIterators == 1)
1597 IteratorPtr* newIterators =
new IteratorPtr[numOfIterators];
1600 for (kkint32 i = 0; i <= numOfIterators; i++)
1602 if (iterators[i] != deletedIterator)
1604 newIterators[j] = iterators[i];
1610 iterators = newIterators;
1617 template <
class Entry,
class CompareNodes,
typename KeyType>
1618 void KKB::RBTree<Entry,CompareNodes,KeyType>::IteratorAdd (
IteratorPtr newIterator)
1620 IteratorPtr* newIterators =
new IteratorPtr[numOfIterators + 1];
1622 for (kkint32 i = 0; i < numOfIterators; i++)
1624 newIterators[i] = iterators[i];
1627 newIterators[numOfIterators] = newIterator;
1630 if (iterators != NULL)
1633 iterators = newIterators;
1640 template <
class Entry,
class CompareNodes,
typename KeyType>
1645 prevNode = tree->nil;
1646 curNode = tree->nil;
1647 nextNode = tree->Minimum ();
1649 tree->IteratorAdd (
this);
1654 template <
class Entry,
class CompareNodes,
typename KeyType>
1658 tree->IteratorDelete (
this);
1664 template <
class Entry,
class CompareNodes,
typename KeyType>
1665 void KKB::
Iterator<Entry,CompareNodes,KeyType>::IsTreeStillThere ()
1669 std::cerr << std::endl
1670 <<
"*** ERROR ***" << std::endl
1672 <<
"*** RBTree<Entry,CompareNodes,KeyType>::Iterator::IsTreeStillThere ***" << std::endl
1674 <<
"Tree is no longer available" << std::endl
1683 template <
class Entry,
class CompareNodes,
typename KeyType>
1686 IsTreeStillThere ();
1688 curNode = tree->GetEqual (tree->root, key);
1690 if (curNode == tree.nil)
1692 nextNode = tree->GetGreater (tree->root, key);
1693 if (nextNode == tree.nil)
1694 prevNode = tree->GetLess (tree->root, key);
1697 prevNode = tree->Predecessor (nextNode);
1703 prevNode = tree->Predecessor (curNode);
1704 nextNode = tree->Successor (curNode);
1706 return curNode->Data ();
1712 template <
class Entry,
class CompareNodes,
typename KeyType>
1715 IsTreeStillThere ();
1717 curNode = tree->GetGreater (tree->root, key);
1719 if (curNode == tree->nil)
1721 nextNode = tree->nil;
1722 prevNode = tree->Maximum (tree->root);
1727 nextNode = tree->Successor (curNode);
1728 prevNode = tree->Predecessor (curNode);
1731 return curNode->Data ();
1737 template <
class Entry,
class CompareNodes,
typename KeyType>
1740 IsTreeStillThere ();
1742 curNode = tree->GetGreaterOrEqual (tree->root, key);
1744 if (curNode == tree->nil)
1746 nextNode = tree->nil;
1747 prevNode = tree->Maximum (tree->root);
1752 nextNode = tree->Successor (tree.curMode);
1753 prevNode = tree->Predecessor (tree.curNode);
1756 return curNode->Data ();
1764 template <
class Entry,
class CompareNodes,
typename KeyType>
1767 IsTreeStillThere ();
1769 prevNode = tree->nil;
1770 curNode = tree->Minimum ();
1771 nextNode = tree->Successor (curNode);
1773 return curNode->Data ();
1779 template <
class Entry,
class CompareNodes,
typename KeyType>
1782 IsTreeStillThere ();
1784 curNode = tree->Maximum ();
1785 prevNode = tree->Predecessor (curNode);
1786 nextNode = tree->nil;
1788 return curNode->Data ();
1794 template <
class Entry,
class CompareNodes,
typename KeyType>
1797 IsTreeStillThere ();
1800 if (nextNode == tree->nil)
1808 if (prevNode == tree->nil)
1810 prevNode = tree->Predecessor (curNode);
1813 nextNode = tree->Successor (curNode);
1815 return curNode->Data ();
1821 template <
class Entry,
class CompareNodes,
typename KeyType>
1824 IsTreeStillThere ();
1826 if (prevNode == tree->nil)
1834 if (nextNode == tree->nil)
1836 prevNode = tree->Successor (curNode);
1839 prevNode = tree->Predecessor (curNode);
1841 return curNode->Data ();
1847 template <
class Entry,
class CompareNodes,
typename KeyType>
1848 void KKB::
Iterator<Entry,CompareNodes,KeyType>::TreeHasBeenDeleted ()
1854 curNode = prevNode = nextNode = NULL;
1860 template <
class Entry,
class CompareNodes,
typename KeyType>
1869 if (prevNode != tree->nil)
1870 prevNode = tree->Predecessor (prevNode);
1877 curNode = tree->nil;
1883 nextNode = tree->Successor (nextNode);
1889 template <
class Entry,
class CompareNodes,
typename KeyType>
bool CompareToTree(TreePtr tree)
RBnode(RBnodePtr _parent, RBnodePtr _left, RBnodePtr _right, RBcolor _color, EntryPtr _entry)
void Right(RBnodePtr _right)
EntryPtr GetLess(const KeyType &key)
EntryPtr GetGreater(const KeyType &key)
RBTree< Entry, CompareNodes, KeyType > * TreePtr
void Data(EntryPtr _data)
EntryPtr GetGreaterOrEqual(const KeyType &key)
Iterator< Entry, CompareNodes, KeyType > * IteratorPtr
RBTree(CompareNodes &_comparator, bool _owner)
unsigned __int32 kkuint32
void DeleteEntry(EntryPtr e)
RBnode< Entry > * NodePtr
void Parent(RBnodePtr _parent)
void Left(RBnodePtr _left)
EntryPtr GetEqual(const KeyType &key)
EntryPtr GetEqual(const KeyType &key)
friend std::ostream & operator<<(std::ostream &os, const Matrix &matrix)
NodePtr RBInsert(EntryPtr e)
EntryPtr GetGreater(const KeyType &key)
RBTree< Entry, CompareNodes, KeyType > Tree
EntryPtr GetGreaterOrEqual(const KeyType &key)
#define INT_MAX
Adapted by Kurt Kramer be a 'class' definition so as to make it more usable in th ePices software wor...
void Color(RBcolor _color)