Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.33 KB | None | 0 0
  1. /**
  2. * Autor: Victor Carbune
  3. * Echipa SD, 2012
  4. *
  5. * Modificari: Adrian Bogatu
  6. * Echipa SD, 2013
  7. *
  8. * Modificari: Cosmin Petrisor
  9. * Echipa SD, 2015
  10. *
  11. * Modificari: Cristian Creteanu
  12. * Echipa SD, 2017
  13. *
  14. * Modificari: Ioana Stefan
  15. * Echipa SD, 2018
  16. * License: LGPL
  17. */
  18.  
  19. #ifndef __BINARY_SEARCH_TREE__H
  20. #define __BINARY_SEARCH_TREE__H
  21.  
  22. #include <iostream>
  23.  
  24. template <typename T>
  25. class BinarySearchTree
  26. {
  27. public:
  28. BinarySearchTree() {
  29. pData = nullptr;
  30. leftNode = nullptr;
  31. rightNode = nullptr;
  32. parent = nullptr;
  33. }
  34. ~BinarySearchTree() {
  35. if (rightNode != nullptr) {
  36. delete rightNode;
  37. }
  38.  
  39. if (leftNode != nullptr) {
  40. delete leftNode;
  41. }
  42.  
  43. if (pData != nullptr) {
  44. delete pData;
  45. }
  46. }
  47.  
  48. bool isEmpty() {
  49. return (pData == nullptr);
  50. }
  51.  
  52. void insertKey(T x) {
  53. if(pData == nullptr) {
  54. pData = new T;
  55. *pData = x;
  56. } else {
  57. if (leftNode == nullptr && x < *pData) {
  58. leftNode = new BinarySearchTree<T>;
  59. leftNode->pData = new T;
  60. *(leftNode->pData) = x;
  61. leftNode->leftNode = leftNode->rightNode = nullptr;
  62. leftNode->parent = this;
  63. } else if (x < *pData) {
  64. leftNode->insertKey(x);
  65. } else if (rightNode == nullptr && x >= *pData) {
  66. rightNode = new BinarySearchTree<T>;
  67. rightNode->pData = new T;
  68. *(rightNode->pData) = x;
  69. rightNode->leftNode = rightNode->rightNode = nullptr;
  70. rightNode->parent = this;
  71. } else if (x >= *pData) {
  72. rightNode->insertKey(x);
  73. }
  74.  
  75. }
  76. }
  77.  
  78. BinarySearchTree<T>* searchKey(T x) {
  79.  
  80. if (pData == nullptr) {
  81. return nullptr;
  82. } else if (*pData == x) {
  83. return this;
  84. }
  85. if (x < *pData) {
  86. if (leftNode != nullptr) {
  87. return leftNode->searchKey(x);
  88. } else {
  89. return nullptr;
  90. }
  91. } else if ( x > *pData) {
  92. if (rightNode != nullptr) {
  93. return rightNode->searchKey(x);
  94. } else {
  95. return nullptr;
  96. }
  97. }
  98.  
  99. return nullptr;
  100. }
  101.  
  102. std::vector<T> inOrderDisplay() {
  103. std::vector<T> res;
  104. std::vector<T> v;
  105. if(pData == nullptr) {
  106. return res;
  107. }
  108. if (leftNode != nullptr) {
  109. v = leftNode->inOrderDisplay();
  110. for ( int i : v) {
  111. res.push_back(i);
  112. }
  113. }
  114. res.push_back(*pData);
  115. if (rightNode != nullptr) {
  116. v = rightNode->inOrderDisplay();
  117. for (int i : v) {
  118. res.push_back(i);
  119. }
  120. }
  121.  
  122. return res;
  123.  
  124. }
  125.  
  126. T findMin() {
  127. // TODO 2
  128. return T();
  129. }
  130.  
  131. T findMax() {
  132. // TODO 2
  133. return T();
  134. }
  135.  
  136. int findLevels() {
  137. // TODO 3
  138. return 0;
  139. }
  140.  
  141. std::vector<T> displayLevel(int level) {
  142. // TODO 3
  143. std::vector<T> res;
  144. return res;
  145. }
  146.  
  147. int removex() {
  148. BinarySearchTree<T>* p;
  149. if (leftNode == NULL && rightNode == NULL) {
  150. if (parent == NULL) {
  151. delete this;
  152. return 1;
  153. } else {
  154. if (parent->leftNode == this) {
  155. parent->leftNode = NULL;
  156. } else {
  157. parent->rightNode = NULL;
  158. }
  159. delete this;
  160. return 0;
  161. }
  162. } else {
  163. if (leftNode != NULL) {
  164. p =leftNode;
  165. while(p->rightNode) {
  166. p = p->rightNode;
  167. }
  168. } else {
  169. p = rightNode;
  170. while(p->leftNode) {
  171. p = p->leftNode;
  172. }
  173. }
  174. *pData = *(p->pData);
  175. return p->removex();
  176. }
  177.  
  178. }
  179. BinarySearchTree<T>* removeKey(T x) {
  180. BinarySearchTree<T>* node = searchKey(x);
  181. if (node != NULL) {
  182. node->removex();
  183. }
  184. return this;
  185. }
  186. private:
  187. BinarySearchTree<T> *leftNode;
  188. BinarySearchTree<T> *rightNode;
  189. BinarySearchTree<T> *parent;
  190. T *pData;
  191. };
  192.  
  193. #endif // __BINARY_SEARCH_TREE_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement