Advertisement
Guest User

Untitled

a guest
Feb 7th, 2014
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.02 KB | None | 0 0
  1. #ifndef BST_H
  2. #define BST_H
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. template<typename T>
  8. class BST
  9. {
  10. private:
  11. class Node
  12. {
  13. public:
  14. Node(const T element);
  15. T element;
  16. Node* left;
  17. Node* right;
  18. };
  19. Node* root;
  20. int nrOfNodes;
  21.  
  22. bool insert(const T& element, Node*& node);
  23. bool contains(const T& element, Node*& node);
  24. string traverse(Node*& node);
  25. void destruct(Node* node);
  26.  
  27. bool goLeft;
  28. bool remove(const T& element, Node*& node);
  29. void replaceLeft(Node* node);
  30. void replaceRight(Node* node);
  31. public:
  32. BST();
  33. bool insert(const T& element);
  34. bool contains(const T& element);
  35. string traverse();
  36. bool remove(const T& element);
  37. ~BST();
  38. };
  39.  
  40. #endif
  41.  
  42. template<typename T>
  43. BST<T>::Node::Node(const T element)
  44. {
  45. this->element = element;
  46. left = nullptr;
  47. right = nullptr;
  48. }
  49.  
  50. template<typename T>
  51. BST<T>::BST()
  52. {
  53. nrOfNodes = 0;
  54. goLeft = true;
  55. root = nullptr;
  56. }
  57.  
  58. template<typename T>
  59. BST<T>::~BST()
  60. {
  61. destruct(root);
  62. }
  63.  
  64. template<typename T>
  65. void BST<T>::destruct(Node* node)
  66. {
  67. if (node != nullptr)
  68. {
  69. destruct(node->left);
  70. destruct(node->right);
  71. delete node;
  72. }
  73. }
  74.  
  75. template<typename T>
  76. bool BST<T>::insert(const T& element)
  77. {
  78. return insert(element, root);
  79. }
  80.  
  81. template<typename T>
  82. bool BST<T>::insert(const T& element, Node*& node)
  83. {
  84. if (node == nullptr)
  85. {
  86. node = new Node(element);
  87. nrOfNodes++;
  88. return true;
  89. }
  90. else if (node->element == element)
  91. {
  92. return false;
  93. }
  94. else
  95. {
  96. if (element < node->element)
  97. {
  98. return insert(element, node->left);
  99. }
  100. else
  101. {
  102. return insert(element, node->right);
  103. }
  104. }
  105. }
  106.  
  107. template<typename T>
  108. bool BST<T>::contains(const T& element)
  109. {
  110. return contains(element, root);
  111. }
  112.  
  113. template<typename T>
  114. bool BST<T>::contains(const T& element, Node*& node)
  115. {
  116. if (node == nullptr)
  117. {
  118. return false;
  119. }
  120. else if (node->element == element)
  121. {
  122. return true;
  123. }
  124. else
  125. {
  126. if (element < node->element)
  127. {
  128. return contains(element, node->left);
  129. }
  130. else
  131. {
  132. return contains(element, node->right);
  133. }
  134. }
  135. }
  136.  
  137. template<typename T>
  138. string BST<T>::traverse()
  139. {
  140. return traverse(root);
  141. }
  142.  
  143. template<typename T>
  144. string BST<T>::traverse(Node*& node)
  145. {
  146. if (node != nullptr)
  147. {
  148. return traverse(node->left).append(node->element.toString().append(traverse(node->right)));
  149. }
  150. }
  151.  
  152. template<typename T>
  153. bool BST<T>::remove(const T& element)
  154. {
  155. return remove(element, root);
  156. }
  157.  
  158. template<typename T>
  159. bool BST<T>::remove(const T& element, Node*& node)
  160. {
  161. if (node == nullptr)
  162. {
  163. return false;
  164. }
  165. else if (node->element == element)
  166. {
  167. if (node->left == nullptr && node->right == nullptr)
  168. {
  169. delete node;
  170. node = nullptr;
  171. }
  172. else
  173. {
  174. if (node->right == nullptr)
  175. {
  176. node->element = node->left->element;
  177. delete node->left;
  178. node->left = nullptr;
  179. }
  180. else if (node->left == nullptr)
  181. {
  182. node->element = node->right->element;
  183. delete node->right;
  184. node->right = nullptr;
  185. }
  186. else
  187. {
  188. if (goLeft)
  189. {
  190. replaceLeft(node);
  191. goLeft = false;
  192. }
  193. else
  194. {
  195. replaceRight(node);
  196. goLeft = true;
  197. }
  198. }
  199. }
  200. nrOfNodes--;
  201. return true;
  202. }
  203. else
  204. {
  205. if (element < node->element)
  206. {
  207. return remove(element, node->left);
  208. }
  209. else
  210. {
  211. return remove(element, node->right);
  212. }
  213. }
  214. }
  215.  
  216. template<typename T>
  217. void BST<T>::replaceLeft(Node* node)
  218. {
  219. Node* iterator = node->left;
  220. if (iterator->right != nullptr)
  221. {
  222. while (iterator->right->right != nullptr)
  223. {
  224. iterator = iterator->right;
  225. }
  226. if (iterator->right->left == nullptr)
  227. {
  228. node->element = iterator->right->element;
  229. delete iterator->right;
  230. iterator->right = nullptr;
  231. }
  232. else
  233. {
  234. node->element = iterator->right->element;
  235. Node* toDel = iterator->right;
  236. iterator->right = iterator->right->left;
  237. delete toDel;
  238. }
  239. }
  240. else
  241. {
  242. if (iterator->left != nullptr)
  243. {
  244. node->element = iterator->element;
  245. delete node->left;
  246. node->left = nullptr;
  247. }
  248. else
  249. {
  250. node->element = iterator->element;
  251. Node* toDel = iterator;
  252. node->left = iterator->left;
  253. delete node->left;
  254. node->left = nullptr;
  255. }
  256. }
  257. }
  258.  
  259. template<typename T>
  260. void BST<T>::replaceRight(Node* node)
  261. {
  262. Node* iterator = node->right;
  263. if (iterator->left != nullptr)
  264. {
  265. while (iterator->left->left != nullptr)
  266. {
  267. iterator = iterator->left;
  268. }
  269. if (iterator->left->right == nullptr)
  270. {
  271. node->element = iterator->left->element;
  272. delete iterator->left;
  273. iterator->left = nullptr;
  274. }
  275. else
  276. {
  277. node->element = iterator->left->element;
  278. Node* toDel = iterator->left;
  279. iterator->left = iterator->left->right;
  280. delete toDel;
  281. }
  282. }
  283. else
  284. {
  285. if (iterator->right != nullptr)
  286. {
  287. node->element = iterator->element;
  288. delete node->right;
  289. node->right = nullptr;
  290. }
  291. else
  292. {
  293. node->element = iterator->element;
  294. Node* toDel = iterator;
  295. node->right = iterator->right;
  296. delete node->right;
  297. node->right = nullptr;
  298. }
  299. }
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement