Open Source Tomb Raider Engine
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

Tree.h 20KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288
  1. /* -*- Mode: C++; tab-width: 3; indent-tabs-mode: t; c-basic-offset: 3 -*- */
  2. /*================================================================
  3. *
  4. * Project : Freyja
  5. * Author : Mongoose
  6. * Website : http://gooseegg.sourceforge.net/
  7. * Email : mongoose@users.sourceforge.net
  8. * Object : Tree
  9. * License : GPL See file COPYING, also (C) 2000 Mongoose
  10. * Comments: Template tree class, which is also the iterator
  11. *
  12. *
  13. * Red-Black trees are a type of binary search trees
  14. * with the properities:
  15. *
  16. * 1. Every node is red or black.
  17. * 2. The root node must be black.
  18. * 3. Every leaf node is black. (null pointers)
  19. * 4. If a node is red, then both its children are black.
  20. * 5. Every simple path from a node to a descendant
  21. * leaf contains the same number of black nodes.
  22. * 6. Any path from the root to a leaf must not have
  23. * adjacent red nodes.
  24. *
  25. *
  26. * This file was generated using Mongoose's C++
  27. * template generator script. <stu7440@westga.edu>
  28. *
  29. *-- History ------------------------------------------------
  30. *
  31. * 2002.02.17:
  32. * Mongoose - Rewritten as a Red-Black tree
  33. *
  34. * 2002.02.16:
  35. * Mongoose - Dug out of cobwebs and fixed up
  36. * Yes, I believe in code reuse! =)
  37. *
  38. * 2000.10.26:
  39. * Mongoose - Created
  40. ================================================================*/
  41. #ifndef _TREE_H_
  42. #define _TREE_H_
  43. #include <stdlib.h>
  44. #include <stdio.h>
  45. #ifdef USE_IOSTREAM
  46. #include <iostream.h>
  47. #endif
  48. #ifdef DEBUG_MEMORY
  49. #include <memory_test.h>
  50. #endif
  51. typedef enum
  52. {
  53. _tree_h_black,
  54. _tree_h_red
  55. } _tree_h_color_t;
  56. template <class Key, class Data> class TreeNode
  57. {
  58. public:
  59. TreeNode(Key key, Data data)
  60. {
  61. SetColor(_tree_h_red);
  62. SetData(data);
  63. SetKey(key);
  64. SetParent(NULL);
  65. SetLeft(NULL);
  66. SetRight(NULL);
  67. }
  68. ~TreeNode()
  69. {
  70. TreeNode<Key, Data> *left;
  71. TreeNode<Key, Data> *right;
  72. left = GetLeft();
  73. right = GetRight();
  74. SetParent(NULL);
  75. SetLeft(NULL);
  76. SetRight(NULL);
  77. if (left)
  78. {
  79. left->SetParent(NULL);
  80. delete left;
  81. }
  82. if (right)
  83. {
  84. right->SetParent(NULL);
  85. delete right;
  86. }
  87. }
  88. /// Color /////////////////////////////////////
  89. void SetColor(_tree_h_color_t color)
  90. {
  91. _color = color;
  92. }
  93. _tree_h_color_t GetColor()
  94. {
  95. return _color;
  96. }
  97. /// Left, child ///////////////////////////////
  98. TreeNode<Key, Data> *GetChild()
  99. {
  100. return GetLeft();
  101. }
  102. void SetChild(TreeNode<Key, Data> *tree)
  103. {
  104. Left(tree);
  105. }
  106. TreeNode<Key, Data> *GetLeft()
  107. {
  108. return _left;
  109. }
  110. void SetLeft(TreeNode<Key, Data> *tree)
  111. {
  112. if (tree == this)
  113. {
  114. return;
  115. }
  116. _left = tree;
  117. if (tree)
  118. {
  119. tree->SetParent(this);
  120. }
  121. }
  122. /// Right, sibling ///////////////////////////
  123. TreeNode<Key, Data> *GetSibling()
  124. {
  125. return GetRight();
  126. }
  127. void SetSibling(TreeNode<Key, Data> *tree)
  128. {
  129. SetRight(tree);
  130. }
  131. TreeNode<Key, Data> *GetRight()
  132. {
  133. return _right;
  134. }
  135. void SetRight(TreeNode<Key, Data> *tree)
  136. {
  137. if (tree == this)
  138. {
  139. return;
  140. }
  141. _right = tree;
  142. if (tree)
  143. {
  144. tree->SetParent(this);
  145. }
  146. }
  147. /// Data //////////////////////////////////////
  148. Data GetData()
  149. {
  150. return _data;
  151. }
  152. void SetData(Data data)
  153. {
  154. _data = data;
  155. }
  156. /// Key ////////////////////////////////////////
  157. Key GetKey()
  158. {
  159. return _key;
  160. }
  161. void SetKey(Key key)
  162. {
  163. _key = key;
  164. }
  165. /// Parent /////////////////////////////////////
  166. TreeNode<Key, Data> *GetParent()
  167. {
  168. return _parent;
  169. }
  170. void SetParent(TreeNode<Key, Data> *parent)
  171. {
  172. _parent = parent;
  173. }
  174. /// Misc ///////////////////////////////////////
  175. #ifdef USE_IOSTREAM
  176. void PrintNode()
  177. {
  178. cout << "(" << _key << ", " << _data << ", "
  179. << ((GetColor() == _tree_h_red) ? "Red" : "Black")
  180. << ")";
  181. }
  182. void PrintInorder()
  183. {
  184. if (_left)
  185. {
  186. _left->PrintInorder();
  187. //cout << ", ";
  188. cout << endl;
  189. }
  190. PrintNode();
  191. if (_right)
  192. {
  193. //cout << ", ";
  194. cout << endl;
  195. _right->PrintInorder();
  196. }
  197. }
  198. #endif
  199. void PrintNodeSpecial(void (*print_func_k)(Key), void (*print_func_d)(Data))
  200. {
  201. printf("(");
  202. if (print_func_k)
  203. (*print_func_k)(_key);
  204. printf(", ");
  205. if (print_func_d)
  206. (*print_func_d)(_data);
  207. printf(", %s)", ((GetColor() == _tree_h_red) ? "Red" : "Black"));
  208. }
  209. void PrintInorderSpecial(void (*print_func_k)(Key), void (*print_func_d)(Data))
  210. {
  211. if (_left)
  212. {
  213. _left->PrintInorderSpecial(print_func_k, print_func_d);
  214. printf(",\n");
  215. // printf(", ");
  216. }
  217. PrintNodeSpecial(print_func_k, print_func_d);
  218. if (_right)
  219. {
  220. printf(",\n");
  221. // printf(", ");
  222. _right->PrintInorderSpecial(print_func_k, print_func_d);
  223. }
  224. }
  225. TreeNode<Key, Data> *SearchByData(Data data, bool *error)
  226. {
  227. TreeNode<Key, Data> *tree = NULL;
  228. *error = true;
  229. if (_data == data)
  230. {
  231. *error = false;
  232. return this;
  233. }
  234. if (_left)
  235. {
  236. tree = _left->SearchByData(data, error);
  237. }
  238. if (_right && !tree)
  239. {
  240. tree = _right->SearchByData(data, error);
  241. }
  242. return tree;
  243. }
  244. TreeNode<Key, Data> *SearchByKey(Key key, bool *error)
  245. {
  246. *error = false;
  247. if (_key == key)
  248. {
  249. return this;
  250. }
  251. else if (_left && key < _key)
  252. {
  253. return _left->SearchByKey(key, error);
  254. }
  255. else if (_right)
  256. {
  257. return _right->SearchByKey(key, error);
  258. }
  259. else
  260. {
  261. *error = true;
  262. return 0; //NULL;
  263. }
  264. }
  265. void Insert(TreeNode<Key, Data> *tree)
  266. {
  267. if (!tree || tree == this)
  268. {
  269. return;
  270. }
  271. if (tree->GetKey() < _key)
  272. {
  273. if (!_left)
  274. {
  275. SetLeft(tree);
  276. }
  277. else
  278. {
  279. _left->Insert(tree);
  280. }
  281. }
  282. else
  283. {
  284. if (!_right)
  285. {
  286. SetRight(tree);
  287. }
  288. else
  289. {
  290. _right->Insert(tree);
  291. }
  292. }
  293. }
  294. private:
  295. _tree_h_color_t _color; /* Color of tree node */
  296. Key _key; /* Unique identifer? */
  297. Data _data; /* Data for this tree */
  298. TreeNode<Key, Data> *_left; /* Left or child node */
  299. TreeNode<Key, Data> *_right; /* Right or sibling node */
  300. TreeNode<Key, Data> *_parent; /* Parent of the tree node */
  301. };
  302. ////////////////////////////////////////////////////////////////
  303. // Iterator
  304. ////////////////////////////////////////////////////////////////
  305. template <class Key, class Data> class Tree
  306. {
  307. public:
  308. Tree()
  309. {
  310. _error = false;
  311. _num_elements = 0;
  312. _root = 0;
  313. }
  314. ~Tree()
  315. {
  316. Clear();
  317. }
  318. unsigned int NumElements()
  319. {
  320. return _num_elements;
  321. }
  322. Data SearchByKey(Key key, bool *error)
  323. {
  324. TreeNode<Key, Data> *seeking;
  325. *error = true;
  326. // Mongoose 2002.02.16, Nothing to search
  327. if (!_root)
  328. {
  329. return 0;
  330. }
  331. seeking = _root->SearchByKey(key, error);
  332. if (seeking)
  333. {
  334. return seeking->GetData();
  335. }
  336. return 0;
  337. }
  338. Key SearchByData(Data data, bool *error)
  339. {
  340. TreeNode<Key, Data> *seeking;
  341. *error = true;
  342. // Mongoose 2002.02.16, Nothing to search
  343. if (!_root)
  344. {
  345. return 0;
  346. }
  347. seeking = _root->SearchByData(data, error);
  348. if (seeking)
  349. {
  350. return seeking->GetKey();
  351. }
  352. return 0;
  353. }
  354. void Insert(Key key, Data data)
  355. {
  356. TreeNode<Key, Data> *tree;
  357. tree = new TreeNode<Key, Data>(key, data);
  358. ++_num_elements;
  359. if (_root)
  360. {
  361. _root->Insert(tree);
  362. RestoreRedBlackAfterInsert(tree);
  363. }
  364. else
  365. {
  366. _root = tree;
  367. _root->SetColor(_tree_h_black);
  368. }
  369. }
  370. bool RemoveByData(Data data)
  371. {
  372. bool error;
  373. if (_root)
  374. {
  375. Remove(_root->SearchByData(data, &error));
  376. }
  377. return error;
  378. }
  379. bool RemoveByKey(Key key)
  380. {
  381. bool error;
  382. if (_root)
  383. {
  384. #ifdef OBSOLETE
  385. // Mongoose 2002.02.18, To remove duplicates
  386. erorr = false;
  387. while (!error)
  388. {
  389. #endif
  390. Remove(_root->SearchByKey(key, &error));
  391. #ifdef OBSOLETE
  392. }
  393. #endif
  394. }
  395. return error;
  396. }
  397. void Erase()
  398. {
  399. Clear();
  400. }
  401. void Clear()
  402. {
  403. if (_root)
  404. {
  405. delete _root;
  406. }
  407. _num_elements = 0;
  408. _error = false;
  409. _root = 0;
  410. }
  411. /// Misc //////////////////////////////////////
  412. Data operator [] (Key key)
  413. {
  414. _error = false;
  415. if (_root)
  416. {
  417. return SearchByKey(key, &_error);
  418. }
  419. _error = true;
  420. return 0;
  421. }
  422. #ifdef USE_IOSTREAM
  423. void PrintTree(TreeNode<Key, Data> *tree, unsigned int height,
  424. unsigned int seek, bool rightmost)
  425. {
  426. TreeNode<Key, Data> *left, *right, *parent;
  427. if (!tree)
  428. {
  429. return;
  430. }
  431. parent = tree->GetParent();
  432. if (height == seek)
  433. {
  434. if (!parent)
  435. {
  436. cout << endl << "[height " << height << "] " << endl;
  437. if (tree->GetColor() == _tree_h_red)
  438. {
  439. cout << "*";
  440. }
  441. }
  442. else
  443. {
  444. if (parent->GetColor() == _tree_h_red &&
  445. tree->GetColor() == _tree_h_red)
  446. {
  447. cout << "*";
  448. }
  449. }
  450. cout << "(" << tree->GetKey() << ", "
  451. << ((tree->GetColor() == _tree_h_red) ? "red" : "blk")
  452. << ")";
  453. if (rightmost)
  454. {
  455. cout << endl << "[height " << (height+1) << "] " << endl;
  456. PrintTree(_root, 0, ++seek, true);
  457. }
  458. else
  459. {
  460. cout << " ";
  461. }
  462. return;
  463. }
  464. else if (seek < height)
  465. {
  466. return;
  467. }
  468. left = tree->GetLeft();
  469. right = tree->GetRight();
  470. ++height;
  471. if (left)
  472. {
  473. PrintTree(left, height, seek, false);
  474. }
  475. else
  476. {
  477. cout << "(-, blk) ";
  478. }
  479. if (right)
  480. {
  481. PrintTree(right, height, seek, rightmost);
  482. }
  483. else
  484. {
  485. cout << "(-, blk) ";
  486. }
  487. if (parent)
  488. {
  489. if (parent->GetRight() != tree)
  490. {
  491. cout << " | ";
  492. }
  493. }
  494. }
  495. void PrintAsTree()
  496. {
  497. PrintTree(_root, 0, 0, true);
  498. cout << endl << "Nodes marked with * are in error" << endl;
  499. }
  500. void Print()
  501. {
  502. cout << "Tree: " << _num_elements <<" elements {" << endl;
  503. if (_root)
  504. {
  505. cout << "Root: ";
  506. _root->PrintNode();
  507. cout << endl;
  508. _root->PrintInorder();
  509. }
  510. cout << endl << "}" << endl;
  511. }
  512. #endif
  513. void PrintSpecial(void (*print_func_k)(Key), void (*print_func_d)(Data))
  514. {
  515. printf("Tree: %i elements {\n", _num_elements);
  516. if (_root && print_func_k && print_func_d)
  517. {
  518. printf("Root: ");
  519. _root->PrintNodeSpecial(print_func_k, print_func_d);
  520. printf("\n");
  521. _root->PrintInorderSpecial(print_func_k, print_func_d);
  522. }
  523. printf("\n}\n");
  524. }
  525. Key Root()
  526. {
  527. if (_root)
  528. {
  529. return _root->GetKey();
  530. }
  531. return 0;
  532. }
  533. bool Error()
  534. {
  535. return _error;
  536. }
  537. bool IsValidRedBlackTree()
  538. {
  539. return IsValidRedBlackTreeCheck(_root, true);
  540. }
  541. private:
  542. TreeNode<Key, Data> *GetSuccessor(TreeNode<Key, Data> *tree)
  543. {
  544. TreeNode<Key, Data> *successor;
  545. successor = tree->GetRight();
  546. if (successor)
  547. {
  548. while (successor->GetLeft())
  549. {
  550. successor = successor->GetLeft();
  551. }
  552. return successor;
  553. }
  554. else
  555. {
  556. successor = tree->GetParent();
  557. while (tree == successor->GetRight())
  558. {
  559. tree = successor;
  560. successor = successor->GetParent();
  561. }
  562. if (successor == _root)
  563. {
  564. return NULL;
  565. }
  566. return successor;
  567. }
  568. }
  569. TreeNode<Key, Data> *GetPredecessor(TreeNode<Key, Data> *tree)
  570. {
  571. TreeNode<Key, Data> *predecessor;
  572. predecessor = tree->GetLeft();
  573. if (predecessor)
  574. {
  575. while (predecessor->GetRight())
  576. {
  577. predecessor = predecessor->GetRight();
  578. }
  579. return predecessor;
  580. }
  581. else
  582. {
  583. predecessor = tree->GetParent();
  584. while (tree == predecessor->GetLeft())
  585. {
  586. if (predecessor == _root)
  587. {
  588. return NULL;
  589. }
  590. tree = predecessor;
  591. predecessor = predecessor->GetParent();
  592. }
  593. return predecessor;
  594. }
  595. }
  596. bool IsValidRedBlackTreeCheck(TreeNode<Key, Data> *current, bool valid)
  597. {
  598. TreeNode<Key, Data> *right, *left;
  599. _tree_h_color_t color_red;
  600. if (!current)
  601. {
  602. return valid;
  603. }
  604. // Mongoose 2002.02.19, Check for a red root
  605. if (!current->GetParent() && current->GetColor() == _tree_h_red)
  606. {
  607. return false;
  608. }
  609. color_red = (current->GetColor() == _tree_h_red);
  610. left = current->GetLeft();
  611. right = current->GetRight();
  612. // Mongoose 2002.02.19, Check for adj red nodes
  613. if (left)
  614. {
  615. if (color_red && left->GetColor() == _tree_h_red)
  616. {
  617. return false;
  618. }
  619. if (!IsValidRedBlackTreeCheck(left, valid))
  620. return false;
  621. }
  622. if (right)
  623. {
  624. if (color_red && right->GetColor() == _tree_h_red)
  625. {
  626. return false;
  627. }
  628. if (!IsValidRedBlackTreeCheck(right, valid))
  629. return false;
  630. }
  631. return true;
  632. }
  633. void RotateLeft(TreeNode<Key, Data> *tree)
  634. {
  635. TreeNode<Key, Data> *right, *right_leftchild, *parent, *uncle;
  636. if (!tree || !_root)
  637. {
  638. return;
  639. }
  640. // Get tree's right node
  641. right = tree->GetRight();
  642. // Get right node's left child
  643. right_leftchild = NULL;
  644. if (right)
  645. {
  646. right_leftchild = right->GetLeft();
  647. }
  648. // Set tree's right node to right's left child
  649. tree->SetRight(right_leftchild);
  650. // Child now has a new parent
  651. if (right_leftchild)
  652. {
  653. right_leftchild->SetParent(tree);
  654. }
  655. // Right also has a new parent
  656. if (right)
  657. {
  658. right->SetParent(tree->GetParent());
  659. }
  660. // Get parent
  661. parent = tree->GetParent();
  662. if (parent) // Not root
  663. {
  664. uncle = parent->GetLeft();
  665. // Mix up at hosptial, switch parent's children!
  666. if (tree == uncle)
  667. {
  668. parent->SetLeft(right);
  669. }
  670. else
  671. {
  672. parent->SetRight(right);
  673. }
  674. }
  675. else // TreeNode 'tree' was root, so now right is root
  676. {
  677. _root = right;
  678. }
  679. if (right)
  680. {
  681. // TreeNode 'tree' is now right's left child
  682. right->SetLeft(tree);
  683. if (tree)
  684. {
  685. tree->SetParent(right);
  686. }
  687. }
  688. }
  689. void RotateRight(TreeNode<Key, Data> *tree)
  690. {
  691. TreeNode<Key, Data> *left, *left_rightchild, *parent, *uncle;
  692. if (!tree || !_root)
  693. {
  694. return;
  695. }
  696. left = tree->GetLeft();
  697. left_rightchild = NULL;
  698. if (left)
  699. {
  700. left_rightchild = left->GetRight();
  701. }
  702. tree->SetLeft(left_rightchild);
  703. if (left_rightchild)
  704. {
  705. left_rightchild->SetParent(tree);
  706. }
  707. if (left)
  708. {
  709. left->SetParent(tree->GetParent());
  710. }
  711. parent = tree->GetParent();
  712. if (parent) //if node is not the root
  713. {
  714. uncle = parent->GetRight();
  715. if (tree == uncle)
  716. {
  717. parent->SetRight(left);
  718. }
  719. else
  720. {
  721. parent->SetLeft(left);
  722. }
  723. }
  724. else
  725. {
  726. _root = left;
  727. }
  728. left->SetRight(tree);
  729. if (tree)
  730. {
  731. tree->SetParent(left);
  732. }
  733. }
  734. void TreeNodeShallowCopy(TreeNode<Key, Data> *src,
  735. TreeNode<Key, Data> *dest, bool no_links)
  736. {
  737. if (!src || !dest)
  738. {
  739. return;
  740. }
  741. dest->SetKey(src->GetKey());
  742. dest->SetData(src->GetData());
  743. dest->SetColor(src->GetColor());
  744. if (!no_links)
  745. {
  746. dest->SetRight(src->GetRight());
  747. dest->SetLeft(src->GetLeft());
  748. dest->SetParent(src->GetParent());
  749. }
  750. }
  751. void Remove(TreeNode<Key, Data> *tree)
  752. {
  753. TreeNode<Key, Data> *left, *right, *parent, *prev, *cur;
  754. // Mongoose 2002.02.16, Nothing to remove
  755. if (!tree || !_root)
  756. {
  757. return;
  758. }
  759. left = tree->GetLeft();
  760. right = tree->GetRight();
  761. parent = tree->GetParent();
  762. if (!left || !right)
  763. {
  764. prev = tree;
  765. }
  766. else
  767. {
  768. prev = GetSuccessor(tree);
  769. }
  770. if (prev->GetLeft())
  771. {
  772. cur = prev->GetLeft();
  773. }
  774. else
  775. {
  776. cur = prev->GetRight();
  777. }
  778. if (cur)
  779. {
  780. cur->SetParent(prev->GetParent());
  781. }
  782. if (!prev->GetParent())
  783. {
  784. _root = cur;
  785. }
  786. else
  787. {
  788. parent = prev->GetParent();
  789. if (prev == parent->GetLeft())
  790. {
  791. parent->SetLeft(cur);
  792. }
  793. else
  794. {
  795. parent->SetRight(cur);
  796. }
  797. }
  798. if (prev != tree)
  799. {
  800. TreeNodeShallowCopy(prev, tree, true);
  801. if (prev->GetParent())
  802. {
  803. if (prev == (prev->GetParent())->GetLeft())
  804. (prev->GetParent())->SetLeft(tree);
  805. else if (prev == (prev->GetParent())->GetRight())
  806. (prev->GetParent())->SetRight(tree);
  807. }
  808. }
  809. --_num_elements;
  810. if (prev)
  811. {
  812. prev->SetRight(NULL);
  813. prev->SetParent(NULL);
  814. prev->SetLeft(NULL);
  815. delete prev;
  816. }
  817. if (tree->GetColor() == _tree_h_black)
  818. {
  819. RestoreRedBlackAfterRemove(cur);
  820. }
  821. }
  822. void RestoreRedBlackAfterRemove(TreeNode<Key, Data> *tree)
  823. {
  824. TreeNode<Key, Data> *parent, *sibling, *sleft, *sright;
  825. if (!tree || !_root)
  826. {
  827. return;
  828. }
  829. parent = tree->GetParent();
  830. while ((tree != _root) && (parent->GetColor() == _tree_h_black))
  831. {
  832. if (tree == parent->GetLeft())
  833. {
  834. sibling = parent->GetRight();
  835. if (sibling && sibling->GetColor() == _tree_h_red)
  836. {
  837. sibling->SetColor(_tree_h_black);
  838. parent->SetColor(_tree_h_red);
  839. RotateLeft(parent);
  840. sibling = parent->GetRight();
  841. }
  842. if (sibling)
  843. {
  844. sleft = sibling->GetLeft();
  845. sright = sibling->GetRight();
  846. }
  847. else
  848. {
  849. sleft = sright = NULL;
  850. }
  851. if (sright && sright->GetColor() == _tree_h_black &&
  852. sleft && sleft->GetColor() ==_tree_h_black)
  853. {
  854. sibling->SetColor(_tree_h_red);
  855. tree = parent;
  856. }
  857. else
  858. {
  859. if (sright && sright->GetColor() == _tree_h_black)
  860. {
  861. sibling->SetColor(_tree_h_red);
  862. sleft->SetColor(_tree_h_black);
  863. RotateRight(sibling);
  864. sibling = parent->GetRight();
  865. }
  866. sibling->SetColor(parent->GetColor());
  867. parent->SetColor(_tree_h_black);
  868. sright->SetColor(_tree_h_black);
  869. RotateLeft(parent);
  870. tree = _root;
  871. }
  872. }
  873. else
  874. {
  875. sibling = parent->GetLeft();
  876. if (sibling && sibling->GetColor() == _tree_h_red)
  877. {
  878. sibling->SetColor(_tree_h_black);
  879. parent->SetColor(_tree_h_red);
  880. RotateLeft(parent);
  881. sibling = parent->GetLeft();
  882. }
  883. if (sibling)
  884. {
  885. sleft = sibling->GetLeft();
  886. sright = sibling->GetRight();
  887. }
  888. else
  889. {
  890. sleft = sright = NULL;
  891. }
  892. if (sright && sright->GetColor() == _tree_h_black &&
  893. sleft && sleft->GetColor() ==_tree_h_black)
  894. {
  895. sibling->SetColor(_tree_h_red);
  896. tree = parent;
  897. }
  898. else
  899. {
  900. if (sleft && sleft->GetColor() == _tree_h_black)
  901. {
  902. sibling->SetColor(_tree_h_red);
  903. sright->SetColor(_tree_h_black);
  904. RotateLeft(sibling);
  905. sibling = parent->GetLeft();
  906. }
  907. sibling->SetColor(parent->GetColor());
  908. parent->SetColor(_tree_h_black);
  909. sleft->SetColor(_tree_h_black);
  910. RotateRight(parent);
  911. tree = _root;
  912. }
  913. }
  914. parent = tree->GetParent();
  915. }
  916. tree->SetColor(_tree_h_black);
  917. }
  918. void RestoreRedBlackAfterInsert(TreeNode<Key, Data> *tree)
  919. {
  920. TreeNode<Key, Data> *parent, *grandparent, *uncle;
  921. if (!tree || !_root || tree == _root)
  922. {
  923. return;
  924. }
  925. tree->SetColor(_tree_h_red);
  926. parent = tree->GetParent();
  927. while ((tree != _root) && (parent->GetColor() == _tree_h_red))
  928. {
  929. grandparent = parent->GetParent();
  930. if (parent == grandparent->GetLeft())
  931. {
  932. uncle = grandparent->GetRight();
  933. if (uncle && uncle->GetColor() == _tree_h_red)
  934. {
  935. // Case 1 - Change the colors
  936. parent->SetColor(_tree_h_black);
  937. uncle->SetColor(_tree_h_black);
  938. grandparent->SetColor(_tree_h_red);
  939. // Move up the tree
  940. tree = grandparent;
  941. }
  942. else // Uncle is a black node
  943. {
  944. if (tree == parent->GetRight())
  945. {
  946. // Case 2 - Move up and rotate
  947. tree = parent;
  948. RotateLeft(tree);
  949. }
  950. // Case 3 - Make no changes to _root tree
  951. // Change colors for Case 2 / Case 3
  952. parent->SetColor(_tree_h_black);
  953. grandparent->SetColor(_tree_h_red);
  954. RotateRight(grandparent);
  955. }
  956. }
  957. else // TreeNode 'tree' is in right subtree
  958. {
  959. uncle = grandparent->GetLeft();
  960. if (uncle && uncle->GetColor() == _tree_h_red)
  961. {
  962. // Case 1 - Change the colors
  963. parent->SetColor(_tree_h_black);
  964. uncle->SetColor(_tree_h_black);
  965. grandparent->SetColor(_tree_h_red);
  966. // Move up the tree
  967. tree = grandparent;
  968. }
  969. else // Uncle is a black node
  970. {
  971. if (tree == parent->GetLeft())
  972. {
  973. // Case 2 - Move up and rotate
  974. tree = parent;
  975. RotateRight(tree);
  976. }
  977. // Case 3 - Make no changes to _root tree
  978. // Change colors for Case 2 / Case 3
  979. parent->SetColor(_tree_h_black);
  980. grandparent->SetColor(_tree_h_red);
  981. RotateLeft(grandparent);
  982. }
  983. }
  984. // Have to adjust parent for new tree node
  985. parent = tree->GetParent();
  986. }
  987. // Mongoose 2002.02.17, Color root black ( heh )
  988. _root->SetColor(_tree_h_black);
  989. }
  990. bool _error; /* Error reporting for operator use */
  991. unsigned int _num_elements; /* Number of nodes in this tree */
  992. TreeNode<Key, Data> *_root; /* Root node */
  993. };
  994. #endif