Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.51 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "iostream"
  3. #include "conio.h"
  4. #include "utility"
  5. #include "iterator"
  6.  
  7. using namespace std;
  8.  
  9. class myTree
  10. {
  11.  
  12. private:
  13. struct node
  14. {
  15. int data;
  16. struct node *right;
  17. struct node *left;
  18. struct node *parent;
  19. };
  20. struct node *p, *start, *ende, *q;
  21. int counter;
  22. int i;
  23.  
  24. // preorder method
  25. int preorder(node* n)
  26. {
  27. preorder(n->right);
  28. preorder(n->left);
  29. i++;
  30. return n->data;
  31. }
  32.  
  33. // bubble_sort method
  34. int * bubble_sort(int intArr[], int n){
  35. int i, j, t;
  36. for(i = n - 2 ; i >= 0 ; i--)
  37. for(j = 0 ; j <= i ; j++)
  38. if(intArr[j] > intArr[j + 1])
  39. {
  40. t = intArr[j];
  41. intArr[j] = intArr[j + 1];
  42. intArr[j + 1] = t;
  43. }
  44.  
  45. return intArr;
  46. }
  47.  
  48. public:
  49. myTree();
  50. ~myTree();
  51. bool insert(int number);
  52. void clear();
  53. node* begin();
  54. node* end();
  55. int cbegin();
  56. int cend();
  57. void balance();
  58. node* find(int number);
  59. bool is_empty();
  60. int get_counter();
  61.  
  62. };
  63.  
  64. // constructor Class
  65. myTree::myTree()
  66. {
  67. // initialized
  68. p = start = (struct node*)malloc(sizeof(node));
  69. start->data = NULL;
  70. start->right = nullptr;
  71. start->left = nullptr;
  72. start->parent = nullptr;
  73.  
  74. counter = 0;
  75. }
  76.  
  77. // destructor Class
  78. myTree::~myTree()
  79. {
  80. free(p);
  81. free(start);
  82. free(q);
  83. free(ende);
  84. }
  85.  
  86. // insert method
  87. bool myTree::insert(int number)
  88. {
  89. if(start->data == NULL)
  90. {
  91. start->data = number;
  92. counter++;
  93. return true;
  94. }
  95. else
  96. {
  97. if(start->left == nullptr && start->right == nullptr && start->data == number)
  98. return false;
  99.  
  100. p = begin();
  101.  
  102. while (true)
  103. {
  104. q = p;
  105. if(p->data < number)
  106. {
  107. if(p->right != nullptr)
  108. p = p->right;
  109. else
  110. {
  111. p->right = (struct node*)malloc(sizeof(node));
  112. break;
  113. }
  114.  
  115. }
  116. else if(p->data > number)
  117. {
  118. if(p->left != nullptr)
  119. p = p->left;
  120. else
  121. {
  122. p->left = (struct node*)malloc(sizeof(node));
  123. break;
  124. }
  125. }
  126. else
  127. return false;
  128. }
  129.  
  130. p->data = number;
  131. p->parent = q;
  132. p->left = nullptr;
  133. p->right = nullptr;
  134. ende = p;
  135. counter++;
  136. return true;
  137. }
  138. }
  139.  
  140. // clear method
  141. void myTree::clear()
  142. {
  143. free(p);
  144. free(start);
  145. free(ende);
  146. free(q);
  147. p = start = q = NULL;
  148. p = start = (struct node*)malloc(sizeof(node));
  149. start->data = NULL;
  150. start->right = nullptr;
  151. start->left = nullptr;
  152. start->parent = nullptr;
  153.  
  154. counter = 0;
  155. }
  156.  
  157. // begin method
  158. myTree::node* myTree::begin()
  159. {
  160. return start;
  161. }
  162.  
  163. // end method
  164. myTree::node* myTree::end()
  165. {
  166. return ende;
  167. }
  168.  
  169. // cbegin method
  170. int myTree::cbegin()
  171. {
  172. return start->data;
  173. }
  174.  
  175. // cend method
  176. int myTree::cend()
  177. {
  178. return ende->data;
  179. }
  180.  
  181. // balance method
  182. void myTree::balance()
  183. {
  184. p = begin();
  185. int node_count = get_counter();
  186. if(node_count < 4)
  187. return;
  188.  
  189. int *arr;
  190. arr = new (nothrow) int[node_count];
  191. if (arr == nullptr)
  192. return;
  193. else
  194. {
  195. i = 0;
  196. arr[i] = p->data;
  197. arr[i] = preorder(p);
  198. arr = bubble_sort(arr, i);
  199. clear();
  200. int main_parent = arr[i/2];
  201. insert(main_parent);
  202.  
  203. for (int j = 0; j < i; j++)
  204. {
  205. if(main_parent==arr[j])
  206. continue;
  207. else
  208. insert(arr[j]);
  209. }
  210. }
  211.  
  212. delete[] arr;
  213. return;
  214. }
  215.  
  216. // find method
  217. myTree::node* myTree::find(int number)
  218. {
  219. p = begin();
  220.  
  221. if(p->data == number)
  222. return p;
  223.  
  224. while (true)
  225. {
  226. if(p->data < number)
  227. {
  228. if(p->right != nullptr)
  229. p = p->right;
  230. else
  231. return nullptr;
  232. }
  233. else if(p->data > number)
  234. {
  235. if(p->left != nullptr)
  236. p = p->right;
  237. else
  238. return nullptr;
  239. }
  240. else
  241. return p;
  242. }
  243.  
  244. return nullptr;
  245. }
  246.  
  247. // is_empty method
  248. bool myTree::is_empty()
  249. {
  250. if(start->data == NULL)
  251. return true;
  252. else
  253. return false;
  254. }
  255.  
  256. // get_counter method
  257. int myTree::get_counter()
  258. {
  259. return counter;
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement