gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Stabla, dodati komentari i ideje za veliki test
[spa2-materijali.git] / Stabla / Primeri za test / StabloProgram.java
1 import java.util.ArrayList;
2 import java.util.List;
3 import java.util.Objects;
5 // Tip podataka koji predstavlja binarno stablo
6 // ID svakog cvora je tipa int a vrednost sadrzana u njemu tipa String
7 // Na velikom testu, studenti ce dobiti ovu klasu
8 class Stablo {
10 private final int id;
11 private String vrednost;
12 private Stablo levi;
13 private Stablo desni;
15 public Stablo(int id) {
16 this(id, null);
17 }
19 public Stablo(int id, String vrednost) {
20 this(id, vrednost, null, null);
21 }
23 public Stablo(int id, String vrednost, Stablo levi, Stablo desni) {
24 this.id = id;
25 this.vrednost = vrednost;
26 this.levi = levi;
27 this.desni = desni;
28 }
30 public int getId() {
31 return id;
32 }
34 public String getVrednost() {
35 return vrednost;
36 }
38 public void setVrednost(String vrednost) {
39 this.vrednost = vrednost;
40 }
42 public Stablo getLevi() {
43 return levi;
44 }
46 public void setLevi(Stablo levi) {
47 this.levi = levi;
48 }
50 public Stablo getDesni() {
51 return desni;
52 }
54 public void setDesni(Stablo desni) {
55 this.desni = desni;
56 }
58 @Override
59 public String toString() {
60 return "(" + id + " \"" + vrednost + "\"" + (levi == null ? "" : " " + levi) + (desni == null ? "" : " " + desni) + ")";
61 }
63 @Override
64 public int hashCode() {
65 final int prostBroj = 31;
66 int rezultat = 1;
67 rezultat = rezultat * prostBroj + id;
68 rezultat = rezultat * prostBroj + ((vrednost == null) ? 0 : vrednost.hashCode());
69 rezultat = rezultat * prostBroj + ((levi == null) ? 0 : levi.hashCode());
70 rezultat = rezultat * prostBroj + ((desni == null) ? 0 : desni.hashCode());
71 return rezultat;
72 }
74 @Override
75 public boolean equals(Object obj) {
77 // Objekat je jednak ako je identican
78 if (this == obj) {
79 return true;
80 }
82 // Null je razlicit od svih objekata
83 if (obj == null) {
84 return false;
85 }
87 // Ako su klase objekata razlicite, onda su i objekti razliciti
88 if (getClass() != obj.getClass()) {
89 return false;
90 }
92 // Pretvorimo prosledjeni objekat u stablo
93 Stablo that = (Stablo) obj;
95 // Razlicit ID znaci da su objekti razliciti
96 if (this.id != that.id) {
97 return false;
98 }
100 // Takodje i vrednost
101 if (Objects.equals(this.vrednost, that.vrednost)) {
102 return false;
105 // Potom levo podstablo
106 if (Objects.equals(this.levi, that.levi)) {
107 return false;
110 // Pa desno podstablo
111 if (Objects.equals(this.desni, that.desni)) {
112 return false;
115 // Sva polja se poklapaju
116 return true;
121 // Glavni program
122 // Na velikom testu ce biti dat kostur koji ucitava potrebno stablo
123 // Od studenata ce se ocekivati da implementiraju neki algoritam poput
124 // statickih metoda koje se pozivaju u ovoj klasi
125 public class StabloProgram {
127 public static void main(String[] args) {
129 // Ucitavanje stabla iz fajla u "pretty" formatu
130 // StabloIO inIO = new StabloIOPretty();
131 // Stablo stablo = inIO.readStablo(Svetovid.in("pretty.txt"));
133 // Generisanje random stabla
134 StabloIO inIO = new StabloIORandom(12345);
135 Stablo stablo = inIO.readStablo(null);
137 // Ispisivanje stabla na ekran
138 StabloIO outIO = new StabloIOPretty();
139 outIO.printStablo(Svetovid.out, stablo);
140 Svetovid.out.println();
142 // Broj nivoa
143 int brojNivoa = brojNivoa(stablo);
144 Svetovid.out.println("Broj nivoa:", brojNivoa);
145 Svetovid.out.println();
147 // Broj elemenata
148 int brojElementata = brojElementata(stablo);
149 Svetovid.out.println("Broj elementata:", brojElementata);
150 Svetovid.out.println();
152 // Najduza String vrednost u stablu
153 String najduzaVrednost = najduzaVrednost(stablo);
154 Svetovid.out.println("Najduza vrednost:", najduzaVrednost);
155 Svetovid.out.println();
157 // Svi Putevi od korena do listova
158 sviPutevi(stablo, new ArrayList<>(brojNivoa));
159 Svetovid.out.println();
161 // Obrnuto stablo
162 Stablo obrnuto = obrni(stablo);
163 outIO.printStablo(Svetovid.out, obrnuto);
164 Svetovid.out.println();
166 // Implementacije ovih algoritama su date ispod kao staticki metodi
167 // Za veliki test, od studenata ce se ocekivati da na isti nacin
168 // implementiraju algoritam koji se bude trazio u zadatku.
169 //
170 // Pored ovde implementiranih algoritama, sledi i par ideja za vezbanje:
171 // - Ispisati vrednosti cvorova sa parnim IDom
172 // - Ispisati sve vrednosti cvorova na nivou koji se ucitava sa tastature
173 // - Utvrditi da li postoji postoji putanja od korena do lista koja sadrzi
174 // string duzine 5
175 // - Napraviti novo stablo iste strukture ali sa svim vrednostima ALL CAPS
176 // - Proveriti da li je dato stablo binarno stablo pretrazivanj, tj. da
177 // su sve vrednosti u levom podstablu leksikografski pre vrednosti u
178 // korenu, svi elementi u desnom leksikografski posle, i ovo takodje
179 // vazi za oba podstabla
180 // - Koliko ima cvorova na nivou 7
181 // - Koliko se puta string "abc" javlja u stablu
185 // Vraca ukupan broj elemenata u stablu
186 private static int brojElementata(Stablo stablo) {
187 if (stablo == null) {
188 return 0; // Prazno stablo ima 0 elemenata
190 return 1 + brojElementata(stablo.getLevi()) + brojElementata(stablo.getDesni());
193 // Vraca visinu stabla
194 private static int brojNivoa(Stablo stablo) {
195 if (stablo == null) {
196 return 0; // Prazno stablo je visine 0
198 return 1 + Math.max(brojNivoa(stablo.getLevi()), brojNivoa(stablo.getDesni()));
201 // Vraca najduzi string sadrzan kao vrednos u nekom od cvorova
202 private static String najduzaVrednost(Stablo stablo) {
203 if (stablo == null) {
204 return null; // Prazno stablo ne sadrzi vrednosti
206 String rezultat = stablo.getVrednost();
207 String levaVrednost = najduzaVrednost(stablo.getLevi());
208 String desnaVrednost = najduzaVrednost(stablo.getDesni());
209 if (rezultat == null || (levaVrednost != null && rezultat.length() < levaVrednost.length())) {
210 rezultat = levaVrednost;
212 if (rezultat == null || (desnaVrednost != null && rezultat.length() < desnaVrednost.length())) {
213 rezultat = desnaVrednost;
215 return rezultat;
218 // Ispisuje sve puteve od korena do listova
219 private static void sviPutevi(Stablo stablo, List<String> put) {
220 if (stablo == null) {
221 return;
223 put.add(stablo.getVrednost());
224 if ((stablo.getLevi() == null) && (stablo.getDesni() == null)) {
225 Svetovid.out.println("Put: " + put);
227 sviPutevi(stablo.getLevi(), put);
228 sviPutevi(stablo.getDesni(), put);
229 put.remove(put.size() - 1);
232 // Vraca obrnuto stablo od datog
233 private static Stablo obrni(Stablo stablo) {
234 if (stablo == null) {
235 return null;
237 Stablo levi = obrni(stablo.getLevi());
238 Stablo desni = obrni(stablo.getDesni());
239 Stablo obrnuto = new Stablo(stablo.getId(), stablo.getVrednost(), desni, levi);
240 return obrnuto;
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner