Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.22 KB | None | 0 0
  1. #include <iostream>
  2. enum class kolor
  3. {
  4. czarny, czerwony
  5. };
  6. template <typename T>
  7. struct wezel {
  8. T dane;
  9. wezel<T>* wskaznikNaRodzica = nullptr;
  10. wezel<T>* wskaznikNaPrawegoPotomka = nullptr;
  11. wezel<T>* wskaznikNaLewegoPotomka = nullptr;
  12. unsigned int indeks;
  13.  
  14. kolor color = kolor::czerwony;
  15. };
  16. template< typename T>
  17. struct drzewo {
  18. wezel<T>* korzen;
  19. int rozmiar = 0;
  20. void dodajNowyWezel(T datas) {
  21. wezel<T>* dziecko = new wezel<T>;
  22. if (rozmiar == 0) {
  23. dziecko->wskaznikNaRodzica = nullptr;
  24. dziecko->wskaznikNaPrawegoPotomka = nullptr;
  25. dziecko->wskaznikNaLewegoPotomka = nullptr;
  26. dziecko->indeks = 0;
  27. korzen = dziecko;
  28. korzen->color = kolor::czarny;
  29. }
  30. else {
  31. wezel<T>* tymczasowy;
  32. tymczasowy = korzen;
  33. while (tymczasowy != nullptr) {
  34. if (tymczasowy->dane > datas) {
  35. if (tymczasowy->wskaznikNaPrawegoPotomka == nullptr) {
  36. tymczasowy->wskaznikNaPrawegoPotomka = dziecko;
  37. dziecko->wskaznikNaRodzica = tymczasowy;
  38. }
  39. else
  40. {
  41. tymczasowy = tymczasowy->wskaznikNaPrawegoPotomka;
  42. }
  43. }
  44. else {
  45. if (tymczasowy->dane > datas) {
  46. if (tymczasowy->wskaznikNaLewegoPotomka == nullptr) {
  47. tymczasowy->wskaznikNaLewegoPotomka = dziecko;
  48. dziecko->wskaznikNaRodzica = tymczasowy;
  49. }
  50. else
  51. {
  52. tymczasowy = tymczasowy->wskaznikNaLewegoPotomka;
  53. }
  54. }
  55. }
  56.  
  57. }
  58. }
  59. dziecko->indeks = rozmiar;
  60. dziecko->dane = datas;
  61. rozmiar++;
  62.  
  63. }
  64. void sprawdzKolory(wezel<T>* ostatni) {
  65. while (ostatni->wskaznikNaRodzica->color == ostatni->color) {
  66. wezel<T>* wujek = nullptr;
  67. wezel<T>* dziadek = ostatni->wskaznikNaRodzica->wskaznikNaRodzica;
  68. if (ostatni->wskaznikNaRodzica == dziadek->wskaznikNaLewegoPotomka) {
  69. if (dziadek->wskaznikNaPrawegoPotomka) {
  70. wujek = dziadek->wskaznikNaPrawegoPotomka;
  71. }
  72. if (wujek->color == kolor::czerwony) {
  73. ostatni->wskaznikNaRodzica->color = kolor::czarny;
  74. wujek->color = kolor::czarny;
  75. dziadek->color = kolor::czerwony;
  76. if (dziadek->dane != korzen->dane) {
  77. ostatni = dziadek;
  78. }
  79. /*else {
  80. break;
  81. }*/
  82. }
  83. if (ostatni == dziadek->wskaznikNaLewegoPotomka->wskaznikNaPrawegoPotomka) {
  84. RotacjaLewa(ostatni->wskaznikNaRodzica, ostatni);
  85. }
  86. else {
  87. ostatni->wskaznikNaRodzica->color = kolor::czarny;
  88. dziadek->color = kolor::czerwony;
  89. RotacjaPrawa(dziadek->wskaznikNaRodzica, dziadek);
  90. if (dziadek->dane != korzen->dane) {
  91. ostatni = dziadek;
  92. }
  93. /*else {
  94. break;
  95. }*/
  96. }
  97. }
  98. else {
  99. if (dziadek->wskaznikNaLewegoPotomka) {
  100. wujek = dziadek->wskaznikNaLewegoPotomka;
  101. }
  102. if (wujek->color == kolor::czerwony) {
  103. ostatni->wskaznikNaRodzica->color = kolor::czarny;
  104. wujek->color = kolor::czarny;
  105. dziadek->color = kolor::czerwony;
  106. if (dziadek->dane != korzen->dane) {
  107. ostatni = dziadek;
  108. }
  109. /*else {
  110. break;
  111. }*/
  112. }
  113. if (ostatni == dziadek->wskaznikNaPrawegoPotomka->wskaznikNaLewegoPotomka) {
  114. RotacjaPrawa(ostatni->wskaznikNaRodzica, ostatni);
  115. }
  116. else {
  117. ostatni->wskaznikNaRodzica->color = kolor::czarny;
  118. dziadek->color = kolor::czerwony;
  119. RotacjaLewa(dziadek->wskaznikNaRodzica, dziadek);
  120. if (dziadek->dane != korzen->dane) {
  121. ostatni = dziadek;
  122. }
  123. /*else {
  124. break;
  125. }*/
  126. }
  127. }
  128. }
  129. korzen->color = kolor::czarny;
  130. }
  131. void RotacjaPrawa(wezel<T>* naRodzica, wezel<T>* naDziecko) {
  132. //Rodzicem elementu naRodzica staje się element naDziecko,
  133. naRodzica->wskaznikNaRodzica = naDziecko;
  134.  
  135. //lewy syn elementu naDziecko staje się prawym synem elementu naRodzica.
  136. naRodzica->wskaznikNaPrawegoPotomka = naDziecko->wskaznikNaLewegoPotomka;
  137.  
  138. //lewym dzieckiem elementu naDziecko staje się element naRodzica.
  139. naDziecko->wskaznikNaLewegoPotomka = naRodzica;
  140. }
  141. void RotacjaLewa(wezel<T>* naRodzica, wezel<T>* naDziecko) {
  142. naRodzica->wskaznikNaRodzica = naDziecko;
  143. naRodzica->wskaznikNaLewegoPotomka = naDziecko->wskaznikNaPrawegoPotomka;
  144. naDziecko->wskaznikNaPrawegoPotomka = naRodzica;
  145. }
  146. wezel<T>* znajdzDane(T datas) {
  147. wezel<T>* cos = korzen;
  148. while (cos) {
  149. if (cos->dane == datas) {
  150. return cos;
  151. }
  152. if (datas > cos->dane) {
  153. cos = cos->wskaznikNaPrawegoPotomka;
  154. }
  155. else {
  156. cos = cos->wskaznikNaLewegoPotomka;
  157. }
  158. return nullptr;
  159. }
  160. }
  161. void wyczyscDrzewo() {
  162. wezel<T>* kasownik = korzen;
  163. wyczyscDrzewoRek(kasownik);
  164. }
  165. void wyczyscDrzewoRek(wezel<T>* kasownik) {
  166. if (kasownik == nullptr) {
  167. return;
  168. }
  169. else {
  170. wyczyscDrzewoRek(kasownik->wskaznikNaLewegoPotomka);
  171. wyczyscDrzewoRek(kasownik->wskaznikNaPrawegoPotomka);
  172. delete kasownik;
  173. }
  174. }
  175. //przechodzenie przez wezły
  176. void InOrder(wezel<T>* drzewo) {
  177. InOrder(drzewo->wskaznikNaLewegoPotomka);
  178. std::cout << drzewo->dane << ' ';
  179. InOrder(drzewo->wskaznikNaPrawegoPotomka);
  180. }
  181. //PreOrder służy do kopiowania drzewa
  182. void PreOrder(wezel<T>* drzewo) {
  183. std::cout << drzewo->dane << ' ';
  184. PreOrder(drzewo->wskaznikNaLewegoPotomka);
  185. PreOrder(drzewo->wskaznikNaPrawegoPotomka);
  186. }
  187. void wysokoscDrzewa() {
  188. int wysokosc = 0;
  189. wysokoscLiczenie(korzen);
  190. wysokosc++;
  191. }
  192. void wysokoscLiczenie(wezel<T>* drzewo) {
  193. InOrder(drzewo->wskaznikNaLewegoPotomka);
  194. std::cout << drzewo->dane << ' ';
  195. InOrder(drzewo->wskaznikNaPrawegoPotomka);
  196. }
  197. void wyswietlDrzewo() {
  198. wyswietlRek(korzen);
  199. }
  200. void wyswietlRek(wezel<T>* korzen) {
  201. if (korzen != nullptr) {
  202. std::cout << " dane " << korzen->dane << " indeks " << korzen->indeks;
  203. if (korzen->wskaznikNaLewegoPotomka != nullptr) {
  204. wyswietlRek(korzen->wskaznikNaLewegoPotomka);
  205. }
  206. if (korzen->wskaznikNaPrawegoPotomka != nullptr) {
  207. wyswietlRek(korzen->wskaznikNaPrawegoPotomka);
  208. }
  209. if (korzen->color == kolor::czerwony)
  210. {
  211. std::cout << "czerwony" << std::endl;
  212. }
  213. else {
  214. std::cout << "czarny" << std::endl;
  215. }
  216. }
  217. }
  218. };
  219. int main() {
  220. drzewo <int> CzerwonoCzarne;
  221. CzerwonoCzarne.dodajNowyWezel(1);
  222. CzerwonoCzarne.dodajNowyWezel(2);
  223. CzerwonoCzarne.dodajNowyWezel(3);
  224. CzerwonoCzarne.dodajNowyWezel(4);
  225. CzerwonoCzarne.wyswietlDrzewo();
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement