Advertisement
Guest User

Untitled

a guest
Nov 30th, 2015
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <time.h>
  4.  
  5. using namespace std;
  6.  
  7. class Wezel
  8. {
  9. public:
  10. int klucz;
  11. Wezel* lewy;
  12. Wezel* prawy;
  13. char tablica[256];
  14.  
  15. };
  16. Wezel* root;
  17. class Drzewo
  18. {
  19. public:
  20. void wstaw(int klucz)
  21. {
  22. Wezel *wskWezel = new Wezel;
  23. wskWezel->lewy = NULL;
  24. wskWezel->prawy = NULL;
  25. wskWezel->klucz = klucz;
  26. Wezel *rodzic = NULL;
  27. Wezel *r = root;
  28. int i = 0;
  29. while (i < 256)
  30. {
  31. wskWezel->tablica[i] = (rand() % 26) + 97;
  32. i++;
  33. }
  34. while (r != NULL)
  35. {
  36. if (r->klucz == klucz)return;
  37. rodzic = r;
  38. if (r->klucz > klucz)
  39. r = r->lewy;
  40. else
  41. r = r->prawy;
  42. }
  43. if (root == NULL)
  44. root = wskWezel;
  45. else if (rodzic->klucz > klucz)
  46. rodzic->lewy = wskWezel;
  47. else
  48. rodzic->prawy = wskWezel;
  49. return;
  50. }
  51. Wezel* wyszukaj(int klucz)
  52. {
  53. Wezel *r = root;
  54. while ((r != NULL) && (klucz != r->klucz))
  55. {
  56. if (r->klucz < klucz)
  57. r = r->prawy;
  58. else
  59. r = r->lewy;
  60. }
  61. if (r)
  62. cout <<"Istnieje element" << endl;
  63. else
  64. cout << "Nie istnieje element" << endl;
  65. return r;
  66. }
  67. void wstaw_wiele(int X)
  68. {
  69. int losowa;
  70. for (int i = 0; i < X; i++)
  71. {
  72. losowa = ((rand() % 1000) * 1000) + (rand() % 990) + 10;
  73. wstaw(losowa);
  74. }
  75. }
  76. void usun(int klucz)
  77. {
  78. Wezel *rodzic = NULL;
  79. Wezel *r = root;
  80. while ((r != NULL) && (klucz != r->klucz))
  81. {
  82. rodzic = r;
  83. if (r->klucz < klucz)
  84. r = r->prawy;
  85. else
  86. r = r->lewy;
  87. }
  88. if (r == NULL)
  89. {
  90. cout << "usuwany obiekt nie istnieje."<<endl;
  91. return;
  92. };
  93.  
  94. if ((r->prawy == NULL) && (r->lewy == NULL))
  95. {
  96. if (r == root)
  97. {
  98. root = NULL;
  99. return;
  100. }
  101. if (rodzic->prawy == r)
  102. rodzic->prawy = NULL;
  103. else
  104. rodzic->lewy = NULL;
  105. return;
  106. }
  107. if (r->prawy == NULL)//usuwany wezel ma tylko lewe podrzewo
  108. {
  109. if (rodzic->prawy == r)
  110. rodzic->prawy = r->lewy;
  111. else
  112. rodzic->lewy = r->lewy;
  113. return;
  114. }
  115. if (r->lewy == NULL)//wezel ma tylko prawe podrzewo
  116. {
  117. if (rodzic->prawy == r)
  118. rodzic->prawy = r->prawy;
  119. else
  120. rodzic->lewy = r->prawy;
  121. return;
  122. }
  123. //usuwany wezel ma oba poddrzewa
  124. Wezel *prerodzic = r;
  125. Wezel *dziecko = r->lewy;
  126. while (dziecko->prawy != NULL)
  127. {
  128. prerodzic = dziecko;
  129. dziecko = dziecko->prawy;
  130. }
  131. if (dziecko == r->lewy)//poprzednik jest lewym potomkiem usuwanego wezla
  132. {
  133. if (rodzic->prawy == r)
  134. rodzic->prawy = dziecko;
  135. else
  136. rodzic->lewy = dziecko;
  137. return;
  138. }
  139. //poprzednik nie jest lewym potomkiem r, lecz jego wnukiem lub praprawnukiem
  140. Wezel *granddziecko = dziecko->lewy;//ewentualny potomek poprzednika
  141. //adopcja potomstwa poprzednika przez jego rodzic
  142. if (prerodzic->prawy = dziecko)
  143. prerodzic->prawy = granddziecko;
  144. else
  145. prerodzic->lewy = granddziecko;
  146.  
  147. dziecko->lewy = r->lewy;//adopcja potomstwa usuwanego wezle przez jego porzednika
  148.  
  149. //adopcja poprzednika przez rodzica usuwanego wezla
  150. if (rodzic->prawy = r)
  151. rodzic->prawy = dziecko;
  152. else
  153. rodzic->lewy = dziecko;
  154. return;
  155. };
  156. void Preorder(Wezel *root)
  157. {
  158. if (root != NULL)
  159. {
  160. cout << root->klucz << endl;
  161. Preorder(root->lewy);
  162. Preorder(root->prawy);
  163. }
  164. return;
  165. }
  166. void Inorder(Wezel *root)
  167. {
  168. if (root == NULL)
  169. {
  170. Inorder(root->lewy);
  171. cout << root->klucz << endl;
  172. Inorder(root->prawy);
  173. }
  174. return;
  175. }
  176. void Postorder(Wezel *root)
  177. {
  178. if (root != NULL)
  179. {
  180. Postorder(root->lewy);
  181. Postorder(root->prawy);
  182. cout << root->klucz << endl;
  183.  
  184. }
  185. return;
  186.  
  187. }
  188. };
  189. int main()
  190. {
  191. srand(time(NULL));
  192. int X, k1, k2, k3, k4;
  193.  
  194. FILE* fp = fopen("inlab03.txt", "r");
  195. if (fp == NULL)
  196. return -1;
  197. fscanf(fp, "%d %d %d %d %d", &X, &k1, &k2, &k3, &k4);
  198. fclose(fp);
  199.  
  200. clock_t begin, end;
  201. double time_spent;
  202. begin = clock();
  203.  
  204. root = NULL;
  205. Drzewo BST;
  206. BST.usun(k1);
  207. BST.wstaw_wiele(X);
  208. BST.wstaw(k1);
  209. BST.wstaw(k2);
  210. BST.wstaw(k3);
  211. BST.wstaw(k4);
  212. BST.usun(k1);
  213. BST.wyszukaj(k1);
  214. BST.usun(k2);
  215. BST.usun(k3);
  216. BST.usun(k4);
  217.  
  218. end = clock();
  219. time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
  220.  
  221. cout << "Czas pracy programu: " << time_spent << endl;
  222. getchar();
  223. return 0;
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement