Advertisement
Guest User

Untitled

a guest
Mar 21st, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.45 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. template<class T>
  7. class BinarySearchTree
  8. {
  9. private:
  10. struct Node {
  11. T key_;
  12. Node* left_;
  13. Node* right_;
  14. Node* p_;
  15. int size_;
  16. Node(const T& key, Node *left = NULL, Node *right = NULL, Node *p = NULL, int index = 0) :
  17. key_(key), left_(left), right_(right), p_(p), size_(index) { }
  18. };
  19.  
  20. Node* root_;
  21.  
  22. public:
  23.  
  24. // Êîíñòðóêòîð "ïî óìîë÷àíèþ" ñîçäàåò ïóñòîå äåðåâî
  25. BinarySearchTree() : root_(NULL) {}
  26.  
  27. // Äåñòðóêòîð îñâîáîæäàåò ïàìÿòü, çàíÿòóþ óçëàìè äåðåâà
  28. ~BinarySearchTree() { deleteSubtree(root_); }
  29.  
  30. // Ïå÷àòü ñòðîêîâîãî èçîáðàæåíèÿ äåðåâà â âûõîäíîé ïîòîê out
  31. void print(ostream & out) const { printNode(out, root_); out << endl; }
  32.  
  33. // Ôóíêöèÿ ïîèñêà ïî êëþ÷ó â áèíàðíîì äåðåâå ïîèñêà
  34. bool iterativeSearch(const T & key) const {
  35. return (iterativeSearchNode(key) != NULL);
  36. }
  37.  
  38. // Âñòàâêà íîâîãî ýëåìåíòà â äåðåâî, íå íàðóøàþùàÿ ïîðÿäêà
  39. // ýëåìåíòîâ. Âñòàâêà ïðîèçâîäèòñÿ â ëèñò äåðåâà
  40. void insert(const T& key) {
  41. if (root_ == NULL)
  42. root_ = new Node(key);
  43. else
  44. //insert(key, root_);
  45. iterativeInsert(key);
  46. }
  47.  
  48. // Óäàëåíèå ýëåìåíòà èç äåðåâà, íå íàðóøàþùåå ïîðÿäêà ýëåìåíòîâ
  49. void deleteKey(const T & key) {
  50. if (iterativeSearch(key))
  51. deleteKey(root_, key);
  52. }
  53.  
  54. // Îïðåäåëåíèå êîëè÷åñòâà óçëîâ äåðåâà
  55. int count() const {
  56. return countSubTree(this->root_);
  57. }
  58. // Îïðåäåëåíèå âûñîòû äåðåâà
  59. int height() const {
  60. return heightSubTree(this->root_);
  61. }
  62.  
  63. T foundIndex(int index) const {
  64. return foundIndex(index, root_);
  65. }
  66.  
  67. T foundIndex(int index, Node* node) const {
  68. int x = index;
  69. if (node->right_ != NULL)
  70. x += (node->right_->size_ + 1);
  71. if (x == node->size_) {
  72. return node->key_;
  73. }
  74. else {
  75. if (x < node->size_) {
  76. if (node->left_ == NULL) {
  77. cout << "Wrong Index\n";
  78. }
  79. else {
  80. return foundIndex(index, node->left_);
  81. }
  82. }
  83. else {
  84. if (node->right_ == NULL) {
  85. cout << "Wrong Index\n";
  86. }
  87. else {
  88. if (node->left_ != NULL) {
  89. index -= (node->left_->size_ + 2);
  90. }
  91. else {
  92. index -= 1;
  93. }
  94. return foundIndex(index, node->right_);
  95. }
  96. }
  97. }
  98. }
  99.  
  100. private:
  101. // Ôóíêöèÿ ïîèñêà àäðåñà óçëà ïî êëþ÷ó â áèíàðíîì äåðåâå ïîèñêà
  102. Node * iterativeSearchNode(const T & key) const {
  103. Node* node = root_;
  104. while (node != NULL && node->key_ != key) {
  105. if (key < node->key_)
  106. node = node->left_;
  107. if (key > node->key_)
  108. node = node->right_;
  109. }
  110. return node;
  111. }
  112.  
  113. //
  114. // Ðåêóðñèâíûå ôóíêöèè, ïðåäñòàâëÿþùèå
  115. // ðåêóðñèâíûå òåëà îñíîâíûõ èíòåðôåéñíûõ ìåòîäîâ
  116. //
  117.  
  118. // Ðåêóðñèâíàÿ ôóíêöèÿ äëÿ îñâîáîæäåíèÿ ïàìÿòè
  119. void deleteSubtree(Node *node) {
  120. if (node == NULL)
  121. return;
  122. if (node->left_ != NULL) {
  123. node->size_ -= (node->left_->size_ + 1);
  124. deleteSubtree(node->left_);
  125. node->left_ = NULL;
  126. }
  127. if (node->right_ != NULL) {
  128. node->size_ -= (node->right_->size_ + 1);
  129. deleteSubtree(node->right_);
  130. node->right_ = NULL;
  131. }
  132. delete node;
  133. }
  134.  
  135. // Ðåêóðñèâíàÿ ôóíêöèÿ îïðåäåëåíèÿ êîëè÷åñòâà óçëîâ äåðåâà
  136. int countSubTree(Node *node) const {
  137. if (node == NULL)
  138. return 0;
  139. return (1 + countSubTree(node->left_) +
  140. countSubTree(node->right_));
  141. }
  142.  
  143. // Ðåêóðñèâíàÿ ôóíêöèÿ îïðåäåëåíèÿ âûñîòû äåðåâà
  144. int heightSubTree(Node *node) const {
  145. if (node == NULL)return 0;
  146. return 1 + max(heightSubTree(node->left_), heightSubTree(node->right_));
  147. }
  148.  
  149. // Ðåêóðñèâíàÿ ôóíêöèÿ äëÿ âûâîäà èçîáðàæåíèÿ äåðåâà â âûõîäíîé ïîòîê
  150. void printNode(ostream & out, Node *root) const {
  151. // Èçîáðàæåíèå äåðåâà çàêëþ÷àåòñÿ â êðóãëûå ñêîáêè.
  152. out << '(';
  153. if (root) {
  154. // Äëÿ óçëîâ äåðåâà äîëæíà áûòü îïðåäåëåíà (èëè ïåðåîïðåäåëåíà)
  155. // îïåðàöèÿ âûâîäà â âûõîäíîé ïîòîê <<
  156. out << root->key_;
  157. printNode(out, root->left_);
  158. printNode(out, root->right_);
  159. }
  160. out << ')';
  161. }
  162.  
  163. // Ðåêóðñèâíàÿ ôóíêöèÿ äëÿ îðãàíèçàöèè îáõîäà óçëîâ äåðåâà.
  164. void inorderWalk(Node *node) const {
  165. if (node != NULL) {
  166. inorderWalk(node.left_);
  167. inorderWalk(node.right_);
  168. }
  169. }
  170.  
  171. void insert(const T& key, Node* node) {
  172. if (key < node->key_) {
  173. if (node->left_ == NULL)
  174. node->left_ = new Node(key, NULL, NULL, node);
  175. else
  176. insert(key, node->left_);
  177. }
  178. if (key >= node->key_) {
  179. if (node->right_ == NULL)
  180. node->right_ = new Node(key, NULL, NULL, node);
  181. else
  182. insert(key, node->right_);
  183. }
  184. }
  185.  
  186. void iterativeInsert(const T& key) {
  187. Node* node = root_;
  188. bool isInsert = 0;
  189. while (isInsert == 0) {
  190. node->size_++;
  191. if (key < node->key_) {
  192. if (node->left_ == NULL) {
  193. node->left_ = new Node(key, NULL, NULL, node);
  194. isInsert = 1;
  195. }
  196. else
  197. node = node->left_;
  198. }
  199. else {
  200. if (node->right_ == NULL) {
  201. node->right_ = new Node(key, NULL, NULL, node);
  202. isInsert = 1;
  203. }
  204. else
  205. node = node->right_;
  206. }
  207. }
  208. }
  209.  
  210. void deleteKey(Node* root, const T& key) {
  211. if (root == NULL)
  212. return;
  213. root->size_--;
  214. if (key < root->key_)
  215. deleteKey(root->left_, key);
  216. else if (key > root->key_)
  217. deleteKey(root->right_, key);
  218. else if (root->left_ != NULL && root->right_ != NULL) {
  219. root->key_ = minimum(root->right_)->key_;
  220. deleteKey(root->right_, root->key_);
  221. }
  222. else
  223. if (root->left_ != NULL) {
  224. root = root->left_;
  225. }
  226. else if (root->right_ != NULL) {
  227. root = root->right_;
  228. }
  229. else {
  230. (root->p_->key_ > root->key_) ? root->p_->left_ = NULL : root->p_->right_ = NULL;
  231. delete root;
  232. }
  233. }
  234.  
  235. Node* minimum(Node* x) {
  236. if (x->left_ == NULL)
  237. return x;
  238. return minimum(x->left_);
  239. }
  240.  
  241.  
  242. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement