Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. enum class kolor
  2. {
  3. czarny, czerwony
  4. };
  5. struct wezel {
  6. wezel() {
  7. wezel* dziecko = new wezel;
  8. }
  9. int dane;
  10. wezel* wskaznikNaRodzica = nullptr;
  11. wezel* wskaznikNaPrawegoPotomka = nullptr;
  12. wezel* wskaznikNaLewegoPotomka = nullptr;
  13. unsigned int indeks;
  14.  
  15. kolor color = kolor::czerwony;
  16. };
  17. struct drzewo {
  18. wezel* korzen;
  19. int rozmiar;
  20. void dodajNowyWezel(int datas) {
  21. wezel* dziecko = new wezel;;
  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* 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->dane = datas;
  60. rozmiar++;
  61. }
  62. void sprawdzKolory(wezel* ostatni) {
  63. while (ostatni->wskaznikNaRodzica->color == ostatni->color) {
  64. wezel* wujek = nullptr;
  65. wezel* dziadek = ostatni->wskaznikNaRodzica->wskaznikNaRodzica;
  66. if (ostatni->wskaznikNaRodzica == dziadek->wskaznikNaLewegoPotomka) {
  67. if (dziadek->wskaznikNaPrawegoPotomka) {
  68. wujek = dziadek->wskaznikNaPrawegoPotomka;
  69. }
  70. if (wujek->color == kolor::czerwony) {
  71. ostatni->wskaznikNaRodzica->color = kolor::czarny;
  72. wujek->color = kolor::czarny;
  73. dziadek->color = kolor::czerwony;
  74. if (dziadek->dane != korzen->dane) {
  75. ostatni = dziadek;
  76. }
  77. else {
  78. break;
  79. }
  80. }
  81. if (ostatni == dziadek->wskaznikNaLewegoPotomka->wskaznikNaPrawegoPotomka) {
  82. RotacjaLewa(ostatni->wskaznikNaRodzica, ostatni);
  83. }
  84. else {
  85. ostatni->wskaznikNaRodzica->color = kolor::czarny;
  86. dziadek->color = kolor::czerwony;
  87. RotacjaPrawa(dziadek->wskaznikNaRodzica, dziadek);
  88. if (dziadek->dane != korzen->dane) {
  89. ostatni = dziadek;
  90. }
  91. /*else {
  92. break;
  93. }*/
  94. }
  95. }
  96. else {
  97. if (dziadek->wskaznikNaLewegoPotomka) {
  98. wujek = dziadek->wskaznikNaLewegoPotomka;
  99. }
  100. if (wujek->color == kolor::czerwony) {
  101. ostatni->wskaznikNaRodzica->color = kolor::czarny;
  102. wujek->color = kolor::czarny;
  103. dziadek->color = kolor::czerwony;
  104. if (dziadek->dane != korzen->dane) {
  105. ostatni = dziadek;
  106. }
  107. /*else {
  108. break;
  109. }*/
  110. }
  111. if (ostatni == dziadek->wskaznikNaPrawegoPotomka->wskaznikNaLewegoPotomka) {
  112. RotacjaPrawa(ostatni->wskaznikNaRodzica, ostatni);
  113. }
  114. else {
  115. ostatni->wskaznikNaRodzica->color = kolor::czarny;
  116. dziadek->color = kolor::czerwony;
  117. RotacjaLewa(dziadek->wskaznikNaRodzica, dziadek);
  118. if (dziadek->dane != korzen->dane) {
  119. ostatni = dziadek;
  120. }
  121. //else { break; }
  122. }
  123. }
  124. }
  125. korzen->color = kolor::czarny;
  126. }
  127. void RotacjaPrawa(wezel* naRodzica, wezel* naDziecko) {
  128. //Rodzicem elementu naRodzica staje się element naDziecko,
  129. naRodzica->wskaznikNaRodzica = naDziecko;
  130.  
  131. //lewy syn elementu naDziecko staje się prawym synem elementu naRodzica.
  132. naRodzica->wskaznikNaPrawegoPotomka = naDziecko->wskaznikNaLewegoPotomka;
  133.  
  134. //lewym dzieckiem elementu naDziecko staje się element naRodzica.
  135. naDziecko->wskaznikNaLewegoPotomka = naRodzica;
  136. }
  137. void RotacjaLewa(wezel* naRodzica, wezel* naDziecko) {
  138. naRodzica->wskaznikNaRodzica = naDziecko;
  139. naRodzica->wskaznikNaLewegoPotomka = naDziecko->wskaznikNaPrawegoPotomka;
  140. naDziecko->wskaznikNaPrawegoPotomka = naRodzica;
  141. }
  142. wezel* znalezienieElementu(int datas) {
  143. wezel* aktualny;
  144. aktualny = korzen;
  145. if (aktualny->dane == datas) {
  146. return aktualny;
  147. }
  148. while (aktualny != nullptr) {
  149. if (aktualny->wskaznikNaLewegoPotomka->dane == datas) {
  150. aktualny = aktualny->wskaznikNaLewegoPotomka;
  151. return aktualny;
  152. }
  153. if (aktualny->wskaznikNaPrawegoPotomka->dane == datas) {
  154. aktualny = aktualny->wskaznikNaPrawegoPotomka;
  155. return aktualny;
  156. }
  157. else {
  158. aktualny = aktualny->wskaznikNaLewegoPotomka;
  159. }
  160. }
  161. }
  162. };
  163.  
  164. int main() {
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement