Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.48 KB | None | 0 0
  1. package zaj4;
  2.  
  3. public class AvlTree {
  4. public Wezel korzen;
  5.  
  6. int liczWysokosc(Wezel wezel) {
  7. if (wezel == null)
  8. return 0;
  9. return wezel.wysokosc;
  10. }
  11.  
  12. Wezel rotacjaPrawo(Wezel wezelA) {
  13. Wezel wezelB = wezelA.lewy;
  14. Wezel choinkaII = wezelB.prawy;
  15.  
  16. wezelB.prawy = wezelA;
  17. wezelA.lewy = choinkaII;
  18.  
  19. aktualizujWysokosci(wezelA, wezelB);
  20.  
  21. return wezelB;
  22. }
  23.  
  24. Wezel rotacjaLewo(Wezel wezelA) {
  25. Wezel wezelB = wezelA.prawy;
  26. Wezel choinkaII = wezelB.lewy;
  27.  
  28. wezelB.lewy = wezelA;
  29. wezelA.prawy = choinkaII;
  30.  
  31. aktualizujWysokosci(wezelA, wezelB);
  32.  
  33. return wezelB;
  34. }
  35.  
  36. private void aktualizujWysokosci(Wezel wezelA, Wezel wezelB) {
  37. wezelA.wysokosc = Math.max(liczWysokosc(wezelA.lewy), liczWysokosc(wezelA.prawy)) + 1;
  38. wezelB.wysokosc = Math.max(liczWysokosc(wezelB.lewy), liczWysokosc(wezelB.prawy)) + 1;
  39. }
  40.  
  41. int liczBalans(Wezel wezel) {
  42. if (wezel == null) return 0;
  43. return liczWysokosc(wezel.lewy) - liczWysokosc(wezel.prawy);
  44. }
  45.  
  46. Wezel dodaj(Wezel wezel, String slowo) {
  47. // jesli nie mamy zadnego elementu
  48. if (wezel == null)
  49. return (new Wezel(slowo));
  50. // idziemy w lewo
  51. if (slowo.compareTo(wezel.slowo) < 0)
  52. wezel.lewy = dodaj(wezel.lewy, slowo);
  53. // idziemy w prawo
  54. else if (slowo.compareTo(wezel.slowo) > 0)
  55. wezel.prawy = dodaj(wezel.prawy, slowo);
  56. else
  57. // gdy takie same to wraca
  58. return wezel;
  59.  
  60. wezel.wysokosc = Math.max(liczWysokosc(wezel.lewy), liczWysokosc(wezel.prawy)) + 1;
  61.  
  62. wezel = balansujDrzewo(wezel);
  63.  
  64. return wezel;
  65. }
  66.  
  67. private Wezel balansujDrzewo(Wezel wezel) {
  68. int aktualnyBalans = liczBalans(wezel);
  69.  
  70. // rotuj w prawo
  71. if (aktualnyBalans == 2 && liczBalans(wezel.lewy) == 1)
  72. return rotacjaPrawo(wezel);
  73.  
  74. // rotuj w lewo
  75. if (aktualnyBalans == -2 && liczBalans(wezel.prawy) == -1)
  76. return rotacjaLewo(wezel);
  77.  
  78. // rotuj w lewo prawo
  79. if (aktualnyBalans == 2 && liczBalans(wezel.lewy) == -1) {
  80. // rotacja w lewo, wezełem B staje sie wezel C
  81. wezel.lewy = rotacjaLewo(wezel.lewy);
  82. // wezel C staje sie korzeniem
  83. return rotacjaPrawo(wezel);
  84. }
  85.  
  86. // rotuj w prawo lewo
  87. if (aktualnyBalans == -2 && liczBalans(wezel.prawy) == 1) {
  88. // wezel C staje sie wezlem B
  89. wezel.prawy = rotacjaPrawo(wezel.prawy);
  90. // korzeniem staje sie wezel C
  91. return rotacjaLewo(wezel);
  92. }
  93. return wezel;
  94. }
  95.  
  96. public boolean czyZawiera(Wezel wezel, String word) {
  97. if (wezel == null) return false;
  98. int wynikPorownania = wezel.slowo.compareTo(word);
  99. if (wynikPorownania == 0) return true;
  100. else if (wynikPorownania > 0) return czyZawiera(wezel.lewy, word);
  101. else return czyZawiera(wezel.prawy, word);
  102. }
  103.  
  104. public Wezel usunWezel(Wezel wezel, String slowo) {
  105. // jeśli nie ma węzłów
  106. if (wezel == null) return null;
  107. // compareTo zwraca ujemną wartość gdy slowo po lewej jest pierwsze
  108.  
  109. // slowo jest mniejsze
  110. if (slowo.compareTo(wezel.slowo) < 0)
  111. // idziemy w lewo
  112. wezel.lewy = usunWezel(wezel.lewy, slowo);
  113. // slowo jest wieksze
  114. if (slowo.compareTo(wezel.slowo) > 0)
  115. // idziemy w prawo
  116. wezel.prawy = usunWezel(wezel.prawy, slowo);
  117.  
  118. // jesli trafilismy
  119. if (slowo.compareTo(wezel.slowo) == 0)
  120. // jesli nie ma dzieci albo jedno dziecko
  121. if (maMaksymalnieJednoDziecko(wezel)) {
  122. // jesli lewe dziecko jest nullem
  123. if (maLeweDziecko(wezel)) wezel = wezel.lewy;
  124. else wezel = wezel.prawy;
  125. } else {
  126. // Szukamy następnika
  127. Wezel temp = wybierzNajmniejszy(wezel.prawy);
  128. // wskaznik zostawiamy, wartosc kopiujemy
  129. wezel.slowo = temp.slowo;
  130. // usuwamy wskaznik na nast
  131. wezel.prawy = usunWezel(wezel.prawy, temp.slowo);
  132. }
  133.  
  134. // jeśli jest liściem
  135. if (wezel == null) return null;
  136.  
  137. wezel.wysokosc = Math.max(liczWysokosc(wezel.lewy), liczWysokosc(wezel.prawy)) + 1;
  138.  
  139. wezel = balansujDrzewo(wezel);
  140.  
  141. return wezel;
  142. }
  143.  
  144. private boolean maMaksymalnieJednoDziecko(Wezel wezel) {
  145. if (wezel == null) return true;
  146. return wezel.lewy == null || wezel.prawy == null;
  147. }
  148.  
  149. private boolean maLeweDziecko(Wezel wezel) {
  150. if (wezel == null) return false;
  151. return wezel.lewy != null;
  152. }
  153.  
  154. public Wezel wybierzNajmniejszy(Wezel wezel) {
  155. Wezel current = wezel;
  156. while (current.lewy != null)
  157. current = current.lewy;
  158. return current;
  159. }
  160.  
  161. public int liczZaczynajaceSie(Wezel wezel, String poczatek) {
  162. if (wezel == null) return 0;
  163. if (wezel.slowo.startsWith(poczatek))
  164. return 1
  165. + liczZaczynajaceSie(wezel.lewy, poczatek)
  166. + liczZaczynajaceSie(wezel.prawy, poczatek);
  167. return liczZaczynajaceSie(wezel.lewy, poczatek)
  168. + liczZaczynajaceSie(wezel.prawy, poczatek);
  169. }
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement