gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control system
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: cfa94f3)
raw | patch | inline | side by side (parent: cfa94f3)
author | Ivan Pribela <ivanpribela@gmail.com> | |
Sat, 7 Nov 2015 17:44:57 +0000 (18:44 +0100) | ||
committer | Ivan Pribela <ivanpribela@gmail.com> | |
Sat, 7 Nov 2015 17:44:57 +0000 (18:44 +0100) |
index 59984d356f0fab3a7b70c51f02e38188639a78cd..f0cab858b97a2a73962fa7ceff41af6b2c90ca20 100644 (file)
import org.svetovid.io.SvetovidReader;\r
import org.svetovid.io.SvetovidWriter;\r
\r
+/*\r
+ * Ovaj interfejs i klase koje ga implementiraju sluze za ucitavanje i\r
+ * snimanje stabala. Nije potrebno znati ih, i bice dati, prilikom izrade\r
+ * prakticnih zadataka.\r
+ */\r
public interface StabloIO {\r
\r
public Stablo readStablo(SvetovidReader in);\r
diff --git a/Stabla/Primeri za test/StabloIOClassic.java b/Stabla/Primeri za test/StabloIOClassic.java
index dcf1d9f20304ba1ecaf5ea2892d4b67ea3d36773..d6b0445360490a2d4be70571d6505710e2f93026 100644 (file)
import org.svetovid.io.SvetovidReader;\r
import org.svetovid.io.SvetovidWriter;\r
\r
-/**\r
- * Format:\r
+/*\r
+ * Ova klasa sluzi za ucitavanje i snimanje stabala. Nije potrebno znati je,\r
+ * i bice data, prilikom izrade prakticnih zadataka.\r
+ *\r
+ * Ocekivani format fajla je sledeci:\r
*\r
* br\r
* id leviId desniId vrednost (x br)\r
+ *\r
+ * Primer fajla je classic.txt\r
*/\r
public class StabloIOClassic implements StabloIO {\r
\r
if (stablo == null) {\r
return element;\r
}\r
- Stablo found = find(stablo, element.id);\r
+ Stablo found = find(stablo, element.getId());\r
if (found == null) {\r
- throw new NoSuchElementException("id: " + element.id);\r
+ throw new NoSuchElementException("id: " + element.getId());\r
}\r
- found.vrednost = element.vrednost;\r
- found.levi = element.levi;\r
- found.desni = element.desni;\r
+ found.setVrednost(element.getVrednost());\r
+ found.setLevi(element.getLevi());\r
+ found.setDesni(element.getDesni());\r
return stablo;\r
}\r
\r
if (stablo == null) {\r
return null;\r
}\r
- if (stablo.id == id) {\r
+ if (stablo.getId() == id) {\r
return stablo;\r
}\r
- Stablo rezultat = find(stablo.levi, id);\r
+ Stablo rezultat = find(stablo.getLevi(), id);\r
if (rezultat != null) {\r
return rezultat;\r
}\r
- return find(stablo.desni, id);\r
+ return find(stablo.getDesni(), id);\r
}\r
\r
@Override\r
if (stablo == null) {\r
return 0;\r
}\r
- return 1 + count(stablo.levi) + count(stablo.desni);\r
+ return 1 + count(stablo.getLevi()) + count(stablo.getDesni());\r
}\r
\r
private static void iterate(SvetovidWriter out, Stablo stablo) {\r
if (stablo == null) {\r
return;\r
}\r
- int id = stablo.id;\r
- int leviId = stablo.levi == null ? -1 : stablo.levi.id;\r
- int desniId = stablo.desni == null ? -1 : stablo.desni.id;\r
- String vrednost = stablo.vrednost;\r
+ int id = stablo.getId();\r
+ int leviId = stablo.getLevi() == null ? -1 : stablo.getLevi().getId();\r
+ int desniId = stablo.getDesni() == null ? -1 : stablo.getDesni().getId();\r
+ String vrednost = stablo.getVrednost();\r
out.println(id, leviId, desniId, vrednost);\r
- iterate(out, stablo.levi);\r
- iterate(out, stablo.desni);\r
+ iterate(out, stablo.getLevi());\r
+ iterate(out, stablo.getDesni());\r
}\r
}\r
diff --git a/Stabla/Primeri za test/StabloIOIndent.java b/Stabla/Primeri za test/StabloIOIndent.java
index 8e9dc83f5eff57fe772ab7d78e21af9cd9ca5ef9..dede26be070cda9db4c91c385a824fae485e8f41 100644 (file)
import org.svetovid.io.SvetovidReader;\r
import org.svetovid.io.SvetovidWriter;\r
\r
-/**\r
- * Format:\r
+/*\r
+ * Ova klasa sluzi za ucitavanje i snimanje stabala. Nije potrebno znati je,\r
+ * i bice data, prilikom izrade prakticnih zadataka.\r
+ *\r
+ * Ocekivani format fajla je sledeci:\r
*\r
* id vrednost\r
- * levi\r
- * desni\r
+ * levi\r
+ * desni\r
+ *\r
+ * Primer fajla je indent.txt\r
*/\r
public class StabloIOIndent implements StabloIO {\r
\r
out.println(prefix + nullSymbol);\r
return;\r
}\r
- int id = stablo.id;\r
- String vrednost = stablo.vrednost;\r
+ int id = stablo.getId();\r
+ String vrednost = stablo.getVrednost();\r
out.print(prefix);\r
out.println(id, vrednost);\r
- write(out, stablo.levi, nullSymbol, indent, prefix + indent);\r
- write(out, stablo.desni, nullSymbol, indent, prefix + indent);\r
+ write(out, stablo.getLevi(), nullSymbol, indent, prefix + indent);\r
+ write(out, stablo.getDesni(), nullSymbol, indent, prefix + indent);\r
}\r
}\r
diff --git a/Stabla/Primeri za test/StabloIOPretty.java b/Stabla/Primeri za test/StabloIOPretty.java
index 6fcc069c358c215190eb03c8dd793d755fd451dc..2df3c03fe3198dcfa2813d292ee8ef997f28153d 100644 (file)
import org.svetovid.io.SvetovidReader;\r
import org.svetovid.io.SvetovidWriter;\r
\r
-/**\r
- * Format:\r
+/*\r
+ * Ova klasa sluzi za ucitavanje i snimanje stabala. Nije potrebno znati je,\r
+ * i bice data, prilikom izrade prakticnih zadataka.\r
+ *\r
+ * Ocekivani format fajla je sledeci:\r
+ *\r
* /-- desni\r
* -(id) vrednost\r
* \-- levi\r
+ *\r
+ * Primer fajla je pretty.txt\r
*/\r
public class StabloIOPretty implements StabloIO {\r
\r
Stablo stablo = elements.get(minIndex);\r
Stablo levi = formStablo(minIndex + 1, endIndex, levels, elements);\r
Stablo desni = formStablo(beginIndex, minIndex, levels, elements);\r
- stablo.levi = levi;\r
- stablo.desni = desni;\r
+ stablo.setLevi(levi);\r
+ stablo.setDesni(desni);\r
return stablo;\r
}\r
\r
builder.append(nullSymbol);\r
} else {\r
builder.append("(");\r
- builder.append(stablo.id);\r
+ builder.append(stablo.getId());\r
builder.append(") ");\r
- builder.append(stablo.vrednost);\r
+ builder.append(stablo.getVrednost());\r
}\r
builder.append("\n");\r
}\r
if (stablo == null) {\r
return;\r
}\r
- if ((nullSymbol != null) || (stablo.desni != null)) {\r
- appendSubtree(builder, stablo.desni, nullSymbol, separated, buildingBlocks, true, prefix);\r
+ if ((nullSymbol != null) || (stablo.getDesni() != null)) {\r
+ appendSubtree(builder, stablo.getDesni(), nullSymbol, separated, buildingBlocks, true, prefix);\r
if (separated) {\r
appendEmpty(builder, buildingBlocks, prefix);\r
}\r
if (stablo == null) {\r
return;\r
}\r
- if ((nullSymbol != null) || (stablo.levi != null)) {\r
+ if ((nullSymbol != null) || (stablo.getLevi() != null)) {\r
if (separated) {\r
appendEmpty(builder, buildingBlocks, prefix);\r
}\r
- appendSubtree(builder, stablo.levi, nullSymbol, separated, buildingBlocks, false, prefix);\r
+ appendSubtree(builder, stablo.getLevi(), nullSymbol, separated, buildingBlocks, false, prefix);\r
}\r
}\r
\r
diff --git a/Stabla/Primeri za test/StabloIORandom.java b/Stabla/Primeri za test/StabloIORandom.java
index d3a98ca4f0cac76bb9db4e1cc12976ec2169e87e..f5880c413a586e4a1d4df513761d5a8b50799f5d 100644 (file)
import org.svetovid.io.SvetovidReader;\r
import org.svetovid.io.SvetovidWriter;\r
\r
+/*\r
+ * Ova klasa sluzi za generisanje random stabala. Nije potrebno znati je,\r
+ * i bice data, prilikom izrade prakticnih zadataka.\r
+ */\r
public class StabloIORandom implements StabloIO {\r
\r
protected long seed;\r
}\r
\r
private Stablo readStablo(Random random, AtomicInteger sequence, int length, int depth) {\r
- if (depth <= 0) {\r
- return null;\r
- }\r
+ if (depth <= 0) {\r
+ return null;\r
+ }\r
int id = sequence.addAndGet(1 + random.nextInt(9));\r
String vrednost = new BigInteger(length, random).toString(36);\r
Stablo desni = readStablo(random, sequence, length + random.nextInt(5), depth - random.nextInt(5));\r
index 148ce7b3e43cb97bbcda6aa26aac122dd86cad11..ee70acebeeeff05a36137139d50dad50a5291233 100644 (file)
import java.util.ArrayList;\r
import java.util.List;\r
+import java.util.Objects;\r
\r
+// Tip podataka koji predstavlja binarno stablo\r
+// ID svakog cvora je tipa int a vrednost sadrzana u njemu tipa String\r
+// Na velikom testu, studenti ce dobiti ovu klasu\r
class Stablo {\r
\r
- public final int id;\r
- public String vrednost;\r
- public Stablo levi;\r
- public Stablo desni;\r
+ private final int id;\r
+ private String vrednost;\r
+ private Stablo levi;\r
+ private Stablo desni;\r
\r
public Stablo(int id) {\r
this(id, null);\r
this.desni = desni;\r
}\r
\r
+ public int getId() {\r
+ return id;\r
+ }\r
+\r
+ public String getVrednost() {\r
+ return vrednost;\r
+ }\r
+\r
+ public void setVrednost(String vrednost) {\r
+ this.vrednost = vrednost;\r
+ }\r
+\r
+ public Stablo getLevi() {\r
+ return levi;\r
+ }\r
+\r
+ public void setLevi(Stablo levi) {\r
+ this.levi = levi;\r
+ }\r
+\r
+ public Stablo getDesni() {\r
+ return desni;\r
+ }\r
+\r
+ public void setDesni(Stablo desni) {\r
+ this.desni = desni;\r
+ }\r
+\r
@Override\r
public String toString() {\r
return "(" + id + " \"" + vrednost + "\"" + (levi == null ? "" : " " + levi) + (desni == null ? "" : " " + desni) + ")";\r
}\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ final int prostBroj = 31;\r
+ int rezultat = 1;\r
+ rezultat = rezultat * prostBroj + id;\r
+ rezultat = rezultat * prostBroj + ((vrednost == null) ? 0 : vrednost.hashCode());\r
+ rezultat = rezultat * prostBroj + ((levi == null) ? 0 : levi.hashCode());\r
+ rezultat = rezultat * prostBroj + ((desni == null) ? 0 : desni.hashCode());\r
+ return rezultat;\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+\r
+ // Objekat je jednak ako je identican\r
+ if (this == obj) {\r
+ return true;\r
+ }\r
+\r
+ // Null je razlicit od svih objekata\r
+ if (obj == null) {\r
+ return false;\r
+ }\r
+\r
+ // Ako su klase objekata razlicite, onda su i objekti razliciti\r
+ if (getClass() != obj.getClass()) {\r
+ return false;\r
+ }\r
+\r
+ // Pretvorimo prosledjeni objekat u stablo\r
+ Stablo that = (Stablo) obj;\r
+\r
+ // Razlicit ID znaci da su objekti razliciti\r
+ if (this.id != that.id) {\r
+ return false;\r
+ }\r
+\r
+ // Takodje i vrednost\r
+ if (Objects.equals(this.vrednost, that.vrednost)) {\r
+ return false;\r
+ }\r
+\r
+ // Potom levo podstablo\r
+ if (Objects.equals(this.levi, that.levi)) {\r
+ return false;\r
+ }\r
+\r
+ // Pa desno podstablo\r
+ if (Objects.equals(this.desni, that.desni)) {\r
+ return false;\r
+ }\r
+\r
+ // Sva polja se poklapaju\r
+ return true;\r
+\r
+ }\r
}\r
\r
+// Glavni program\r
+// Na velikom testu ce biti dat kostur koji ucitava potrebno stablo\r
+// Od studenata ce se ocekivati da implementiraju neki algoritam poput\r
+// statickih metoda koje se pozivaju u ovoj klasi\r
public class StabloProgram {\r
\r
public static void main(String[] args) {\r
\r
- // Ucitavanje stabla\r
+ // Ucitavanje stabla iz fajla u "pretty" formatu\r
+ // StabloIO inIO = new StabloIOPretty();\r
+ // Stablo stablo = inIO.readStablo(Svetovid.in("pretty.txt"));\r
+\r
+ // Generisanje random stabla\r
StabloIO inIO = new StabloIORandom(12345);\r
Stablo stablo = inIO.readStablo(null);\r
\r
Svetovid.out.println("Broj nivoa:", brojNivoa);\r
Svetovid.out.println();\r
\r
- // Broj nivoa\r
+ // Broj elemenata\r
int brojElementata = brojElementata(stablo);\r
Svetovid.out.println("Broj elementata:", brojElementata);\r
Svetovid.out.println();\r
\r
- // Broj nivoa\r
+ // Najduza String vrednost u stablu\r
String najduzaVrednost = najduzaVrednost(stablo);\r
Svetovid.out.println("Najduza vrednost:", najduzaVrednost);\r
Svetovid.out.println();\r
outIO.printStablo(Svetovid.out, obrnuto);\r
Svetovid.out.println();\r
\r
+ // Implementacije ovih algoritama su date ispod kao staticki metodi\r
+ // Za veliki test, od studenata ce se ocekivati da na isti nacin\r
+ // implementiraju algoritam koji se bude trazio u zadatku.\r
+ //\r
+ // Pored ovde implementiranih algoritama, sledi i par ideja za vezbanje:\r
+ // - Ispisati vrednosti cvorova sa parnim IDom\r
+ // - Ispisati sve vrednosti cvorova na nivou koji se ucitava sa tastature\r
+ // - Utvrditi da li postoji postoji putanja od korena do lista koja sadrzi\r
+ // string duzine 5\r
+ // - Napraviti novo stablo iste strukture ali sa svim vrednostima ALL CAPS\r
+ // - Proveriti da li je dato stablo binarno stablo pretrazivanj, tj. da\r
+ // su sve vrednosti u levom podstablu leksikografski pre vrednosti u\r
+ // korenu, svi elementi u desnom leksikografski posle, i ovo takodje\r
+ // vazi za oba podstabla\r
+ // - Koliko ima cvorova na nivou 7\r
+ // - Koliko se puta string "abc" javlja u stablu\r
+\r
}\r
\r
+ // Vraca ukupan broj elemenata u stablu\r
private static int brojElementata(Stablo stablo) {\r
if (stablo == null) {\r
- return 0;\r
+ return 0; // Prazno stablo ima 0 elemenata\r
}\r
- return 1 + brojElementata(stablo.levi) + brojElementata(stablo.desni);\r
+ return 1 + brojElementata(stablo.getLevi()) + brojElementata(stablo.getDesni());\r
}\r
\r
+ // Vraca visinu stabla\r
private static int brojNivoa(Stablo stablo) {\r
if (stablo == null) {\r
- return 0;\r
+ return 0; // Prazno stablo je visine 0\r
}\r
- return 1 + Math.max(brojNivoa(stablo.levi), brojNivoa(stablo.desni));\r
+ return 1 + Math.max(brojNivoa(stablo.getLevi()), brojNivoa(stablo.getDesni()));\r
}\r
\r
+ // Vraca najduzi string sadrzan kao vrednos u nekom od cvorova\r
private static String najduzaVrednost(Stablo stablo) {\r
if (stablo == null) {\r
- return null;\r
+ return null; // Prazno stablo ne sadrzi vrednosti\r
}\r
- String rezultat = stablo.vrednost;\r
- String levaVrednost = najduzaVrednost(stablo.levi);\r
- String desnaVrednost = najduzaVrednost(stablo.desni);\r
+ String rezultat = stablo.getVrednost();\r
+ String levaVrednost = najduzaVrednost(stablo.getLevi());\r
+ String desnaVrednost = najduzaVrednost(stablo.getDesni());\r
if (rezultat == null || (levaVrednost != null && rezultat.length() < levaVrednost.length())) {\r
rezultat = levaVrednost;\r
}\r
return rezultat;\r
}\r
\r
+ // Ispisuje sve puteve od korena do listova\r
private static void sviPutevi(Stablo stablo, List<String> put) {\r
if (stablo == null) {\r
return;\r
}\r
- put.add(stablo.vrednost);\r
- if ((stablo.levi == null) && (stablo.desni == null)) {\r
+ put.add(stablo.getVrednost());\r
+ if ((stablo.getLevi() == null) && (stablo.getDesni() == null)) {\r
Svetovid.out.println("Put: " + put);\r
}\r
- sviPutevi(stablo.levi, put);\r
- sviPutevi(stablo.desni, put);\r
+ sviPutevi(stablo.getLevi(), put);\r
+ sviPutevi(stablo.getDesni(), put);\r
put.remove(put.size() - 1);\r
}\r
\r
+ // Vraca obrnuto stablo od datog\r
private static Stablo obrni(Stablo stablo) {\r
if (stablo == null) {\r
return null;\r
}\r
- Stablo levi = obrni(stablo.levi);\r
- Stablo desni = obrni(stablo.desni);\r
- Stablo obrnuto = new Stablo(stablo.id, stablo.vrednost, desni, levi);\r
+ Stablo levi = obrni(stablo.getLevi());\r
+ Stablo desni = obrni(stablo.getDesni());\r
+ Stablo obrnuto = new Stablo(stablo.getId(), stablo.getVrednost(), desni, levi);\r
return obrnuto;\r
}\r
}\r