Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.22 KB | None | 0 0
  1. //ALGO2 IS1 221A LAB04
  2. //Marcin Bogacz
  3. //mbogacz06@wp.pl
  4.  
  5. #include "pch.h"
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <time.h>
  9. #include <iostream>
  10. #include <fstream>
  11. #include <cstdlib>
  12. #include <string.h>
  13. #include <cstring>
  14. using namespace std;
  15.  
  16. struct Wezel {
  17. char tab[10];
  18. int klucz;
  19. Wezel* mniejsze;
  20. Wezel* wieksze;
  21. Wezel() { wieksze = nullptr, mniejsze = nullptr; }
  22. };
  23.  
  24. struct Drzewo {
  25. Wezel* root;
  26. Drzewo() { root = nullptr; }
  27. bool wstawianie(int);
  28. Wezel* szukanie(int);
  29. //Wezel* balance(int[], int, int);
  30. void rotate_right(Wezel*, Wezel*, Wezel*);
  31. void rotate_left(Wezel*, Wezel*, Wezel*);
  32. void make_backbone(Wezel*);
  33. void make_perfect_tree(int);
  34. void deleteTree(Wezel*);
  35. bool usuwanie(int);
  36. int preorder(Wezel*, int);
  37. int inorder(Wezel*, int);
  38. int postorder(Wezel*, int);
  39.  
  40. };
  41.  
  42. Wezel* Drzewo::szukanie(int klucz)
  43. {
  44. Wezel* p = root;
  45. while (p)
  46. {
  47. if (klucz < p->klucz)
  48. {
  49. p = p->mniejsze;
  50. }
  51. else if (klucz > p->klucz)
  52. {
  53. p = p->wieksze;
  54. }
  55. else if (klucz == p->klucz)
  56. {
  57. return p;
  58. }
  59. }
  60. return nullptr;
  61. }
  62.  
  63. bool Drzewo::wstawianie(int klucz)
  64. {
  65. Wezel* previous = nullptr;
  66. Wezel* p = root;
  67. while (p != nullptr)
  68. {
  69. if (p->klucz == klucz)
  70. {
  71. return false;
  72. }
  73. previous = p;
  74. if (p->klucz < klucz)
  75. {
  76. p = p->wieksze;
  77. }
  78. else
  79. {
  80. p = p->mniejsze;
  81. }
  82. }
  83. Wezel* new_node = new Wezel;
  84. new_node->klucz = klucz;
  85. char tab[10];
  86. _itoa_s(klucz, tab, 10);
  87. for (int i = 0; i < 10; i++)
  88. {
  89. new_node->tab[i] = tab[i];
  90. }
  91. if (previous == nullptr)
  92. {
  93. root = new_node;
  94. return true;
  95. }
  96. if (previous->klucz < klucz)
  97. {
  98. previous->wieksze = new_node;
  99. }
  100. else
  101. {
  102. previous->mniejsze = new_node;
  103. }
  104. return true;
  105. }
  106.  
  107. /*
  108. Wezel* Drzewo:: balance(int data[],int first,int last)
  109. {
  110. int middle = (first + last) / 2;
  111. if (first <= last)
  112. {
  113. Wezel* new_node = new Wezel;
  114. new_node->klucz = data[middle];
  115. char tab[10];
  116. _itoa_s(data[middle], tab, 10);
  117. for (int i = 0; i < 10; i++)
  118. {
  119. new_node->tab[i] = tab[i];
  120. }
  121. new_node->mniejsze = balance(data, first, middle - 1);
  122. new_node->wieksze = balance(data, middle + 1, last);
  123.  
  124. }
  125. return(node);
  126. }
  127. */
  128.  
  129. void Drzewo::rotate_right(Wezel* grandfather, Wezel* parent, Wezel* child)
  130. {
  131. Wezel* tmp = new Wezel;
  132. if (grandfather != nullptr)
  133. {
  134. if (grandfather->wieksze == parent)
  135. {
  136. grandfather->wieksze = child;
  137. }
  138. else
  139. {
  140. grandfather->mniejsze = child;
  141. }
  142. }
  143. else
  144. {
  145. root = child;
  146. }
  147. tmp = child->wieksze;
  148. child->wieksze = parent;
  149. parent->mniejsze = tmp;
  150. return;
  151. }
  152.  
  153. void Drzewo::rotate_left(Wezel* grandfather, Wezel* parent, Wezel* child)
  154. {
  155. Wezel* tmp = new Wezel;
  156. if (grandfather != nullptr)
  157. {
  158. if (grandfather->mniejsze == parent)
  159. {
  160. grandfather->mniejsze = child;
  161. }
  162. else
  163. {
  164. grandfather->wieksze = child;
  165. }
  166. }
  167. else
  168. {
  169. root = child;
  170. }
  171. tmp = child->mniejsze;
  172. child->mniejsze = parent;
  173. parent->wieksze = tmp;
  174. return;
  175. }
  176.  
  177. void Drzewo::make_backbone(Wezel* root)
  178. {
  179. Wezel* grandfather = nullptr;
  180. Wezel* tmp = root;
  181. while (tmp != nullptr)
  182. {
  183. if (tmp->mniejsze != nullptr)
  184. {
  185. Wezel* tmp2 = tmp->mniejsze;
  186. rotate_right(grandfather, tmp, tmp->mniejsze);
  187. tmp = tmp2;
  188. }
  189. else
  190. {
  191. grandfather = tmp;
  192. tmp = tmp->wieksze;
  193. }
  194. }
  195. }
  196.  
  197. void Drzewo::make_perfect_tree(int N)
  198. {
  199. Wezel* grandfather = nullptr;
  200. Wezel* tmp = root;
  201. int m = 1;
  202. while (m < N)
  203. {
  204. m = 2 * m + 1;
  205. }
  206. m = m / 2;
  207. for (int i = 0; i < (N - m); i++)
  208. {
  209. Wezel* tmp2 = tmp->wieksze;
  210. if (tmp2 != nullptr)
  211. {
  212. rotate_left(grandfather, tmp, tmp->wieksze);
  213. grandfather = tmp2;
  214. tmp = tmp2->wieksze;
  215. }
  216. }
  217. while (m > 1)
  218. {
  219. m = m / 2;
  220. grandfather = nullptr;
  221. tmp = root;
  222. for (int i = 0; i < m; i++)
  223. {
  224. Wezel* tmp2 = tmp->wieksze;
  225. rotate_left(grandfather, tmp, tmp->wieksze);
  226. grandfather = tmp2;
  227. tmp = tmp2->wieksze;
  228. }
  229. }
  230. }
  231.  
  232. void Drzewo::deleteTree(Wezel* node)
  233. {
  234. if (node == nullptr)
  235. {
  236. return;
  237. }
  238. deleteTree(node->mniejsze);
  239. deleteTree(node->wieksze);
  240. free(node);
  241. }
  242.  
  243. bool Drzewo::usuwanie(int klucz)
  244. {
  245. Wezel* previous = root;
  246. Wezel* p = root;
  247. while (p != nullptr)
  248. {
  249. if (p->klucz == klucz)
  250. {
  251. if (p->mniejsze == nullptr && p->wieksze == nullptr)
  252. {
  253. if (p->klucz > previous->klucz)
  254. {
  255. previous->wieksze = nullptr;
  256. }
  257. else
  258. {
  259. previous->mniejsze = nullptr;
  260. }
  261. delete p;
  262. return true;
  263. }
  264. else if (p->mniejsze == nullptr || p->wieksze == nullptr)
  265. {
  266. if (p->klucz < previous->klucz)
  267. {
  268. if (p->mniejsze == nullptr)
  269. {
  270. previous->mniejsze = p->wieksze;
  271. delete p;
  272. return true;
  273. }
  274. if (p->wieksze == nullptr)
  275. {
  276. previous->mniejsze = p->mniejsze;
  277. }
  278. }
  279. else if (p->klucz < previous->klucz)
  280. {
  281. if (p->mniejsze == nullptr)
  282. {
  283. previous->mniejsze = p->wieksze;
  284. delete p;
  285. return true;
  286. }
  287. if (p->wieksze == nullptr)
  288. {
  289. previous->mniejsze = p->mniejsze;
  290. }
  291. }
  292. }
  293. else
  294. {
  295. Wezel* minimum = p->wieksze;
  296. Wezel* minimumP = p;
  297. while (minimum->mniejsze != nullptr)
  298. {
  299. minimumP = minimum;
  300. minimum = minimum->mniejsze;
  301. }
  302. p->klucz = minimum->klucz;
  303. for (auto i = 0; i < 10; i++)
  304. {
  305. p->tab[i] = minimum->tab[i];
  306. }
  307. if (minimum == p->wieksze)
  308. {
  309. p->wieksze = minimum->wieksze;
  310. delete minimum;
  311. return true;
  312. }
  313. else if (minimum->wieksze != nullptr)
  314. {
  315. minimumP->mniejsze = minimum->wieksze;
  316. delete minimum;
  317. return true;
  318. }
  319. }
  320. }
  321. previous = p;
  322. if (p->klucz < klucz)
  323. {
  324. p = p->wieksze;
  325. }
  326. else
  327. {
  328. p = p->mniejsze;
  329. }
  330. }
  331. return false;
  332. }
  333.  
  334. int Drzewo::preorder(Wezel* p, int licznik = 0)
  335. {
  336. if (p) {
  337. std::cout << p->klucz << " ";
  338. preorder(p->mniejsze);
  339. preorder(p->wieksze);
  340. }
  341. return 0;
  342. }
  343.  
  344. int Drzewo::inorder(Wezel* p, int licznik = 0)
  345. {
  346. if (p) {
  347. preorder(p->mniejsze);
  348. std::cout << p->klucz << " ";
  349. preorder(p->wieksze);
  350. }
  351. return 0;
  352. }
  353.  
  354. int Drzewo::postorder(Wezel* p, int licznik = 0)
  355. {
  356. if (p) {
  357. preorder(p->mniejsze);
  358. preorder(p->wieksze);
  359. std::cout << p->klucz << " ";
  360. }
  361. return 0;
  362. }
  363.  
  364. int losKlucz()
  365. {
  366. int klucz;
  367. klucz = (rand() % 20001) - 10000;
  368. return klucz;
  369. }
  370.  
  371.  
  372. int main()
  373. {
  374. //czas-start--------------------------
  375. srand(time(NULL));
  376. clock_t begin, end;
  377. double time_spent;
  378. begin = clock();
  379. //wczytwyanie-z-pliku------------------
  380. int iloscElementow2, iloscElementow1;
  381. ifstream dane("inlab05.txt");
  382. dane >> iloscElementow1;
  383. dane >> iloscElementow2;
  384. cout << "ilosc Elementow 1= " << iloscElementow1 << endl;
  385. cout << "ilosc Elementow 2= " << iloscElementow2 << endl;
  386.  
  387. cout << endl;
  388. //--tworzenie--drzewa------------------
  389. Drzewo drzewo;
  390.  
  391. for (int i = 0; i < iloscElementow1; i++)
  392. {
  393. int klucz;
  394. klucz = losKlucz();
  395. drzewo.wstawianie(klucz);
  396. }
  397. drzewo.make_perfect_tree(iloscElementow1);
  398. drzewo.deleteTree(drzewo.root);
  399.  
  400.  
  401. //czas-stop----------------------------
  402. end = clock();
  403. time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
  404. cout << "Czas wykonania: " << time_spent << endl;
  405. system("PAUSE");
  406. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement