Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <time.h>
  3. #include <exception>
  4. #include <random>
  5. enum class kolor
  6. {
  7. czarny, czerwony
  8. };
  9. template <typename T>
  10. struct wezel {
  11. T dane;
  12. wezel<T>* wskaznikNaRodzica = nullptr;
  13. wezel<T>* wskaznikNaPrawegoPotomka = nullptr;
  14. wezel<T>* wskaznikNaLewegoPotomka = nullptr;
  15. unsigned int indeks = 0;
  16.  
  17. kolor color = kolor::czerwony;
  18. };
  19. template< typename T>
  20. struct drzewo {
  21. wezel<T>* korzen = nullptr;
  22. int rozmiar = 0;
  23. void dodajNowyWezel(T datas) {
  24. wezel<T>* dziecko = new wezel<T>;
  25. if (rozmiar == 0) {
  26. dziecko->wskaznikNaRodzica = nullptr;
  27. dziecko->wskaznikNaPrawegoPotomka = nullptr;
  28. dziecko->wskaznikNaLewegoPotomka = nullptr;
  29. dziecko->indeks = 0;
  30. korzen = dziecko;
  31. korzen->color = kolor::czarny;
  32. }
  33. else {
  34. wezel<T>* tymczasowy;
  35. tymczasowy = korzen;
  36. while (tymczasowy != nullptr) {
  37. if (tymczasowy->wskaznikNaPrawegoPotomka == nullptr) {
  38. if (tymczasowy->dane <= datas) {
  39. tymczasowy->wskaznikNaPrawegoPotomka = dziecko;
  40. dziecko->wskaznikNaRodzica = tymczasowy;
  41. tymczasowy = dziecko;
  42. break;
  43. }
  44. tymczasowy = tymczasowy->wskaznikNaPrawegoPotomka;
  45. }
  46. else {
  47. if (tymczasowy->wskaznikNaLewegoPotomka == nullptr) {
  48. tymczasowy->wskaznikNaLewegoPotomka = dziecko;
  49. dziecko->wskaznikNaRodzica = tymczasowy;
  50. tymczasowy = dziecko;
  51. break;
  52. }
  53. tymczasowy = tymczasowy->wskaznikNaLewegoPotomka;
  54. }
  55.  
  56. }
  57. tymczasowy = dziecko;
  58. sprawdzKolory(tymczasowy);
  59. }
  60.  
  61. dziecko->indeks = rozmiar;
  62. dziecko->dane = datas;
  63. rozmiar++;
  64.  
  65. }
  66. void sprawdzKolory(wezel<T>* ostatni) {
  67. wezel<T>* chwilowy = ostatni;
  68. if (chwilowy == korzen) {
  69. chwilowy->color = kolor::czarny;
  70. return;
  71. }
  72. while (chwilowy->wskaznikNaRodzica != nullptr && chwilowy->wskaznikNaRodzica->color != kolor::czarny) {
  73. if (chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->wskaznikNaLewegoPotomka == chwilowy->wskaznikNaRodzica) {
  74. if (chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->wskaznikNaPrawegoPotomka != nullptr && chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->wskaznikNaPrawegoPotomka->color == kolor::czerwony) {
  75.  
  76. chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->wskaznikNaPrawegoPotomka->color = kolor::czarny;
  77. chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->color = kolor::czerwony;
  78. chwilowy->wskaznikNaRodzica->color = kolor::czarny;
  79. chwilowy = chwilowy->wskaznikNaRodzica->wskaznikNaRodzica;
  80.  
  81. }
  82. else {
  83. if (chwilowy->wskaznikNaRodzica->wskaznikNaPrawegoPotomka == chwilowy) {
  84. chwilowy = chwilowy->wskaznikNaRodzica;
  85. RotacjaLewa(chwilowy, chwilowy->wskaznikNaPrawegoPotomka);
  86. }
  87. chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->color = kolor::czerwony;
  88. chwilowy->wskaznikNaRodzica->color = kolor::czarny;
  89. RotacjaPrawa(chwilowy->wskaznikNaRodzica->wskaznikNaRodzica, chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->wskaznikNaLewegoPotomka);
  90. }
  91. }
  92. else {
  93. if (chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->wskaznikNaLewegoPotomka != nullptr && chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->wskaznikNaLewegoPotomka->color != kolor::czarny) {
  94. chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->wskaznikNaLewegoPotomka->color = kolor::czarny;
  95. chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->color = kolor::czerwony;
  96. chwilowy->wskaznikNaRodzica->color = kolor::czarny;
  97. chwilowy = chwilowy->wskaznikNaRodzica->wskaznikNaRodzica;
  98. }
  99. else {
  100. if (chwilowy->wskaznikNaRodzica->wskaznikNaLewegoPotomka == chwilowy) {
  101. chwilowy = chwilowy->wskaznikNaRodzica;
  102. RotacjaPrawa(chwilowy, chwilowy->wskaznikNaLewegoPotomka);
  103. }
  104. chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->color = kolor::czerwony;
  105. chwilowy->wskaznikNaRodzica->color = kolor::czarny;
  106. RotacjaLewa(chwilowy->wskaznikNaRodzica->wskaznikNaRodzica, chwilowy->wskaznikNaRodzica->wskaznikNaRodzica->wskaznikNaPrawegoPotomka);
  107. }
  108. }
  109. korzen->color = kolor::czarny;
  110. }
  111. }
  112. void RotacjaPrawa(wezel<T>* naRodzica, wezel<T>* naDziecko) {
  113. //Rodzicem elementu naRodzica staje się element naDziecko,
  114. naRodzica->wskaznikNaRodzica = naDziecko;
  115.  
  116. //lewy syn elementu naDziecko staje się prawym synem elementu naRodzica.
  117. naRodzica->wskaznikNaPrawegoPotomka = naDziecko->wskaznikNaLewegoPotomka;
  118.  
  119. //lewym dzieckiem elementu naDziecko staje się element naRodzica.
  120. naDziecko->wskaznikNaLewegoPotomka = naRodzica;
  121. }
  122. void RotacjaLewa(wezel<T>* naRodzica, wezel<T>* naDziecko) {
  123. naRodzica->wskaznikNaRodzica = naDziecko;
  124. naRodzica->wskaznikNaLewegoPotomka = naDziecko->wskaznikNaPrawegoPotomka;
  125. naDziecko->wskaznikNaPrawegoPotomka = naRodzica;
  126. }
  127. wezel<T>* znajdzDane(T datas) {
  128. wezel<T>* cos = korzen;
  129. while (cos) {
  130. if (cos->dane == datas) {
  131. return cos;
  132. }
  133. if (datas > cos->dane) {
  134. cos = cos->wskaznikNaPrawegoPotomka;
  135. }
  136. else {
  137. cos = cos->wskaznikNaLewegoPotomka;
  138. }
  139. return nullptr;
  140. }
  141. }
  142. void wyczyscDrzewo() {
  143. wezel<T>* kasownik = korzen;
  144. wyczyscDrzewoRek(kasownik);
  145. }
  146. void wyczyscDrzewoRek(wezel<T>* kasownik) {
  147. if (kasownik == nullptr) {
  148. return;
  149. }
  150. else {
  151. wyczyscDrzewoRek(kasownik->wskaznikNaLewegoPotomka);
  152. wyczyscDrzewoRek(kasownik->wskaznikNaPrawegoPotomka);
  153. delete kasownik;
  154. }
  155. }
  156. void wysokosc() {
  157. int wysokosc = wysokoscRek(korzen);
  158. std::cout << "wysokosc drzewa: " << wysokosc << std::endl;
  159. }
  160. int wysokoscRek(wezel<T> * cos) {
  161. int prawa;
  162. int lewa;
  163. // sprawdzamy prawa odnoge
  164. if (cos->wskaznikNaPrawegoPotomka != nullptr) {
  165. prawa = wysokoscRek(cos->wskaznikNaPrawegoPotomka);
  166. }
  167. else {
  168. prawa = 0;
  169. }
  170. //sprawdzamy lewa odnoge
  171. if (cos->wskaznikNaLewegoPotomka != nullptr) {
  172. lewa = wysokoscRek(cos->wskaznikNaLewegoPotomka);
  173. }
  174. else {
  175. lewa = 0;
  176. }
  177. //zwracamy wieksza
  178. if (lewa < prawa) {
  179. return prawa;
  180. }
  181. else
  182. {
  183. return lewa;
  184. }
  185. }
  186. //przechodzenie przez wezły
  187. void InOrder(wezel<T>* drzewo) {
  188. InOrder(drzewo->wskaznikNaLewegoPotomka);
  189. std::cout << drzewo->dane << ' ';
  190. InOrder(drzewo->wskaznikNaPrawegoPotomka);
  191. }
  192. //PreOrder służy do kopiowania drzewa
  193. void PreOrder(wezel<T>* drzewo) {
  194. std::cout << drzewo->dane << ' ';
  195. PreOrder(drzewo->wskaznikNaLewegoPotomka);
  196. PreOrder(drzewo->wskaznikNaPrawegoPotomka);
  197. }
  198. void wyswietlDrzewo() {
  199. wyswietlRek(korzen);
  200. }
  201. void wyswietlRek(wezel<T>* korzen) {
  202. if (korzen != nullptr) {
  203. std::cout << " dane " << korzen->dane << " indeks " << korzen->indeks;
  204. }
  205. if (korzen->color == kolor::czerwony)
  206. {
  207. std::cout << " czerwony ";
  208. }
  209. else {
  210. std::cout << " czarny ";
  211. }
  212. if (korzen->wskaznikNaLewegoPotomka == nullptr) {
  213. std::cout << " LP: brak ";
  214. }
  215. if (korzen->wskaznikNaLewegoPotomka != nullptr) {
  216. std::cout << " LP: " << korzen->wskaznikNaLewegoPotomka->indeks;
  217. }
  218. if (korzen->wskaznikNaPrawegoPotomka == nullptr) {
  219. std::cout << " PP: brak " << std::endl;
  220. }
  221. if (korzen->wskaznikNaPrawegoPotomka != nullptr) {
  222. std::cout << " PP: " << korzen->wskaznikNaPrawegoPotomka->indeks << std::endl;
  223. }
  224. if (korzen->wskaznikNaLewegoPotomka != nullptr) {
  225. wyswietlRek(korzen->wskaznikNaLewegoPotomka);
  226. }
  227. if (korzen->wskaznikNaPrawegoPotomka != nullptr) {
  228. wyswietlRek(korzen->wskaznikNaPrawegoPotomka);
  229. }
  230.  
  231. }
  232. };
  233. int main() {
  234. std::random_device rd;
  235. std::mt19937 gen(rd());
  236. std::uniform_int_distribution<> losowa(1, 10000);
  237. drzewo <int>* CzerwonoCzarne = new drzewo <int>(); // stworzenie drzewa
  238. CzerwonoCzarne->dodajNowyWezel(1);
  239. CzerwonoCzarne->dodajNowyWezel(2);
  240. CzerwonoCzarne->dodajNowyWezel(3);
  241. CzerwonoCzarne->dodajNowyWezel(4);
  242. CzerwonoCzarne->dodajNowyWezel(5);
  243. CzerwonoCzarne->dodajNowyWezel(6);
  244. CzerwonoCzarne->dodajNowyWezel(8);
  245. CzerwonoCzarne->dodajNowyWezel(7);
  246. CzerwonoCzarne->dodajNowyWezel(9);
  247. CzerwonoCzarne->dodajNowyWezel(10);
  248. //const int MAX_ORDER = 7; // maksymalny rzad wielkosci dodawanych danych
  249. //drzewo <int>* CzerwonoCzarne = new drzewo <int>(); // stworzenie drzewa
  250. //for (int o = 1; o <= MAX_ORDER; o++)
  251. //{
  252. // const int n = pow(10, o); // rozmiar danych
  253. // // dodawanie do drzewa
  254. // clock_t t1 = clock();
  255. // for (int i = 0; i < n; i++)
  256. // {
  257. // int liczba = losowa(gen);
  258. // CzerwonoCzarne->dodajNowyWezel(liczba);
  259. // }
  260. // clock_t t2 = clock();
  261. // double time = (t2 - t1) / (double)CLOCKS_PER_SEC;
  262. // std::cout << "Czas dodawania " << n << " elemenow: " << time << std::endl;
  263. CzerwonoCzarne->wyswietlDrzewo();
  264. CzerwonoCzarne->wysokosc();
  265.  
  266. delete CzerwonoCzarne;
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement