gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control systemdiff --git a/Stabla/StabloOpstegTipa/ResenoStabloProgram.java b/Stabla/StabloOpstegTipa/ResenoStabloProgram.java
+++ /dev/null
@@ -1,502 +0,0 @@
-import java.util.Comparator;\r
-import java.util.NoSuchElementException;\r
-import java.util.Objects;\r
-\r
-// Tip podataka koji sadrzi binarno stablo\r
-class BinarnoStablo<T> {\r
-\r
- // Tip podataka koji opisuje jedan cvor stabla\r
- private static class Cvor<T> {\r
- \r
- T element;\r
- Cvor<T> levo;\r
- Cvor<T> desno;\r
-\r
- Cvor(T element, Cvor<T> levo, Cvor<T> desno) {\r
- this.element = element;\r
- this.levo = levo;\r
- this.desno = desno;\r
- }\r
- }\r
-\r
- // Cvor koji je koren stabla\r
- // Ako je stablo prazno, koren je null\r
- protected Cvor<T> koren;\r
-\r
- // Kreiramo prazno stablo\r
- public BinarnoStablo() {\r
- koren = null;\r
- }\r
-\r
- // Kreiramo stablo sa datim elementom u korenu\r
- // bez levog i desnog podstabla\r
- public BinarnoStablo(T element) {\r
- koren = new Cvor<>(element, null, null);\r
- }\r
-\r
- // Kreiramo novo stablo sa datim elementom u korenu\r
- // i datim levim i desnim podstablom\r
- public BinarnoStablo(T element, BinarnoStablo<T> levo, BinarnoStablo<T> desno) {\r
- koren = new Cvor<T>(element, levo.koren, desno.koren);\r
- }\r
-\r
- // Zasticeni konstruktor za kreiranje novog stabla\r
- // sa korenom u datom cvoru ovog stabla\r
- protected BinarnoStablo(Cvor<T> koren) {\r
- this.koren = koren;\r
- }\r
-\r
- public T getElement() {\r
- if (koren == null) { // Stablo je prazno\r
- throw new NoSuchElementException();\r
- }\r
- return koren.element;\r
- }\r
-\r
- public void setElement(T element) {\r
- if (koren == null) { // Stablo je prazno\r
- throw new NoSuchElementException();\r
- }\r
- koren.element = element;\r
- }\r
-\r
- public BinarnoStablo<T> getLevoPodstablo() {\r
- if (koren == null) { // Stablo je prazno\r
- throw new NoSuchElementException();\r
- }\r
- if (koren.levo == null) { // Nema levog podstabla\r
- return null;\r
- }\r
- return new BinarnoStablo<T>(koren.levo);\r
- }\r
-\r
- public void setLevoPodstablo(BinarnoStablo<T> levo) {\r
- if (koren == null) { // Stablo je prazno\r
- throw new NoSuchElementException();\r
- }\r
- if (levo == null) {\r
- koren.levo = null;\r
- } else {\r
- koren.levo = levo.koren;\r
- }\r
- }\r
-\r
- public BinarnoStablo<T> getDesnoPodstablo() {\r
- if (koren == null) { // Stablo je prazno\r
- throw new NoSuchElementException();\r
- }\r
- if (koren.desno == null) {\r
- return null;\r
- }\r
- return new BinarnoStablo<T>(koren.desno);\r
- }\r
-\r
- public void setDesnoPodstablo(BinarnoStablo<T> desno) {\r
- if (koren == null) { // Stablo je prazno\r
- throw new NoSuchElementException();\r
- }\r
- if (desno == null) {\r
- koren.desno = null;\r
- } else {\r
- koren.desno = desno.koren;\r
- }\r
- }\r
-\r
- //DatoNaVezbama\r
- public int brojElemenata() {\r
- // Spremimo argumente i pozovemo rekurzivni metod\r
- return brojElemenata(koren);\r
- }\r
-\r
- // Metod koji zapravo resava dati problem\r
- //DatoNaVezbama\r
- protected static <T> int brojElemenata(Cvor<T> cvor) {\r
- if (cvor == null) {\r
- return 0;\r
- }\r
- int broj = 1;\r
- broj = broj + brojElemenata(cvor.levo);\r
- broj = broj + brojElemenata(cvor.desno);\r
- return broj;\r
- }\r
-\r
- //DatoNaVezbama\r
- public int brojNivoa() {\r
- // Spremimo argumente i pozovemo rekurzivni metod\r
- return brojNivoa(koren);\r
- }\r
-\r
- // Metod koji zapravo resava dati problem\r
- //DatoNaVezbama\r
- protected static <T> int brojNivoa(Cvor<T> cvor) {\r
- if (cvor == null) {\r
- return 0;\r
- }\r
- int brojNivoaLevog = brojNivoa(cvor.levo);\r
- int brojNivoaDesnog = brojNivoa(cvor.desno);\r
- return Math.max(brojNivoaLevog, brojNivoaDesnog) + 1;\r
- }\r
-\r
- public boolean jePrazno() {\r
- return koren == null;\r
- }\r
-\r
- public boolean postojiElement(T element) {\r
- return postojiElement(koren, element);\r
- }\r
- \r
- protected static <T> boolean postojiElement(Cvor<T> cvor, T element) {\r
- if (cvor == null) {\r
- return false;\r
- }\r
- if (Objects.equals(cvor.element, element)) {\r
- return true;\r
- }\r
- if (postojiElement(cvor.levo, element)) {\r
- return true;\r
- }\r
- if (postojiElement(cvor.desno, element)) {\r
- return true;\r
- }\r
- return false;\r
- }\r
-\r
- public T min(Comparator<T> komparator) {\r
- return min(koren, komparator);\r
- }\r
-\r
- protected static <T> T min(Cvor<T> cvor, Comparator<T> komparator) {\r
- if (cvor == null) {\r
- return null;\r
- }\r
- T min = cvor.element;\r
- T levoMin = min(cvor.levo, komparator);\r
- if (komparator.compare(min, levoMin) > 0) {\r
- min = levoMin;\r
- }\r
- T desnoMin = min(cvor.desno, komparator);\r
- if (komparator.compare(min, desnoMin) > 0) {\r
- min = desnoMin;\r
- }\r
- return min;\r
- }\r
- \r
- public T max(Comparator<T> komparator) {\r
- return max(koren, komparator);\r
- }\r
-\r
- protected static <T> T max(Cvor<T> cvor, Comparator<T> komparator) {\r
- if (cvor == null) {\r
- return null;\r
- }\r
- T max = cvor.element;\r
- T levoMax = max(cvor.levo, komparator);\r
- if (komparator.compare(max, levoMax) > 0) {\r
- max = levoMax;\r
- }\r
- T desnoMax = max(cvor.desno, komparator);\r
- if (komparator.compare(max, desnoMax) > 0) {\r
- max = desnoMax;\r
- }\r
- return max;\r
- }\r
-\r
- public BinarnoStablo<T> pronadji(T element) {\r
- Cvor<T> cvor = pronadji(koren, element);\r
- if (cvor == null) {\r
- return null;\r
- }\r
- return new BinarnoStablo<>(cvor);\r
- }\r
-\r
- protected static <T> Cvor<T> pronadji(Cvor<T> cvor, T element) {\r
- if (cvor == null) {\r
- return null;\r
- }\r
- if (Objects.equals(cvor.element, element)) {\r
- return cvor;\r
- }\r
- Cvor<T> nadjenLevo = pronadji(cvor.levo, element);\r
- if (nadjenLevo != null) {\r
- return nadjenLevo;\r
- }\r
- Cvor<T> nadjenDesno = pronadji(cvor.desno, element);\r
- if (nadjenDesno != null) {\r
- return nadjenDesno;\r
- }\r
- return null;\r
- }\r
-\r
- public boolean ubaci(T roditelj, T potomak, boolean levo) {\r
- return ubaci(koren, roditelj, potomak, levo);\r
- }\r
-\r
- protected static <T> boolean ubaci(Cvor<T> cvor, T roditelj, T potomak, boolean levo) {\r
- cvor = pronadji(cvor, roditelj);\r
- if (cvor == null) {\r
- return false;\r
- }\r
- if (levo) {\r
- if (cvor.levo != null) {\r
- return false;\r
- }\r
- cvor.levo = new Cvor<T>(potomak, null, null);\r
- } else {\r
- if (cvor.desno != null) {\r
- return false;\r
- }\r
- cvor.desno = new Cvor<T>(potomak, null, null);\r
- }\r
- return true;\r
- }\r
-\r
- public BinarnoStablo<T> roditeljOd(T potomak) {\r
- Cvor<T> cvor = roditeljOd(koren, null, potomak);\r
- if (cvor == null) {\r
- return null;\r
- }\r
- return new BinarnoStablo<>(cvor);\r
- }\r
- \r
- protected static <T> Cvor<T> roditeljOd(Cvor<T> cvor, Cvor<T> roditelj, T potomak) {\r
- if (cvor == null) {\r
- return null;\r
- }\r
- if (Objects.equals(cvor.element, potomak)) {\r
- return roditelj;\r
- }\r
- Cvor<T> roditeljLevo = roditeljOd(cvor.levo, cvor, potomak);\r
- if (roditeljLevo != null) {\r
- return roditeljLevo;\r
- }\r
- Cvor<T> roditeljDesno = roditeljOd(cvor.desno, cvor, potomak);\r
- if (roditeljDesno != null) {\r
- return roditeljDesno;\r
- }\r
- return null;\r
- }\r
-\r
- public BinarnoStablo<T> kopija() {\r
- return new BinarnoStablo<T>(kopija(koren));\r
- }\r
-\r
- protected static <T> Cvor<T> kopija(Cvor<T> cvor) {\r
- if (cvor == null) {\r
- return null;\r
- }\r
- return new Cvor<T>(cvor.element, kopija(cvor.levo), kopija(cvor.desno));\r
- }\r
-\r
- public BinarnoStablo<T> obrnuto() {\r
- return new BinarnoStablo<T>(obrnuto(koren));\r
- }\r
-\r
- protected static <T> Cvor<T> obrnuto(Cvor<T> cvor) {\r
- if (cvor == null) {\r
- return null;\r
- }\r
- return new Cvor<T>(cvor.element, obrnuto(cvor.desno), obrnuto(cvor.levo));\r
- }\r
-\r
- public void stampajPreorder() {\r
- stampajPreorder(koren);\r
- }\r
- protected static <T> void stampajPreorder(Cvor<T> cvor) {\r
- if (cvor == null) {\r
- return;\r
- }\r
- Svetovid.out.println(cvor.element);\r
- stampajPreorder(cvor.levo);\r
- stampajPreorder(cvor.desno);\r
- }\r
-\r
- public void stampajInorder() {\r
- stampajInorder(koren);\r
- }\r
- \r
- protected static <T> void stampajInorder(Cvor<T> cvor) {\r
- if (cvor == null) {\r
- return;\r
- }\r
- stampajInorder(cvor.levo);\r
- Svetovid.out.println(cvor.element);\r
- stampajInorder(cvor.desno);\r
- }\r
- \r
- public void stampajPostorder() {\r
- stampajPostorder(koren);\r
- }\r
- \r
- protected static <T> void stampajPostorder(Cvor<T> cvor) {\r
- if (cvor == null) {\r
- return;\r
- }\r
- stampajPostorder(cvor.levo);\r
- stampajPostorder(cvor.desno);\r
- Svetovid.out.println(cvor.element);\r
- }\r
- \r
- public void stampajListove() {\r
- stampajListove(koren);\r
- }\r
- \r
- protected static <T> void stampajListove(Cvor<T> cvor) {\r
- if (cvor == null) {\r
- return;\r
- }\r
- if ((cvor.levo == null) && (cvor.desno == null)) {\r
- Svetovid.out.println(cvor.element);\r
- }\r
- stampajListove(cvor.levo);\r
- stampajListove(cvor.desno);\r
- }\r
- \r
- public void stampajSveIspod(T element) {\r
- stampajSveIspod(koren, element);\r
- }\r
- \r
- protected static <T> void stampajSveIspod(Cvor<T> cvor, T element) {\r
- Cvor<T> nadjen = pronadji(cvor, element);\r
- if (nadjen != null) {\r
- stampajInorder(nadjen.levo);\r
- stampajInorder(nadjen.desno);\r
- }\r
- }\r
-}\r
-\r
- //definisemo neke komparatore za konkretnu klasu koju cemo\r
- // ubacivati u nase stablo\r
-\r
- class KomparatorPoStarosti implements Comparator<Osoba> {\r
- public int compare(Osoba o1, Osoba o2) {\r
- if (o1 == null && o2 == null) {\r
- return 0;\r
- }\r
- if (o1 == null) {\r
- return 1;\r
- }\r
- if (o2 == null) {\r
- return -1;\r
- }\r
- return o2.getGodinaRodjenja() - o1.getGodinaRodjenja();\r
- }\r
- }\r
- \r
- class KomparatorPoDuziniPrezimena implements Comparator<Osoba> {\r
- public int compare(Osoba o1, Osoba o2) {\r
- if (o1 == null && o2 == null) {\r
- return 0;\r
- }\r
- if (o1 == null) {\r
- return 1;\r
- }\r
- if (o2 == null) {\r
- return -1;\r
- }\r
- return o2.getPrezime().length() - o1.getPrezime().length();\r
- }\r
- }\r
-\r
-// Glavna klasa\r
-public class ResenoStabloProgram {\r
-\r
- // Glavni program\r
- public static void main(String[] args) {\r
-\r
- // Kreiramo objekat koji koristimo za ucitavanje i ispisivanje stabla\r
- StabloIOPretty<Osoba> io = new StabloIOPretty<>(Konverter.OSOBA);\r
-\r
- // Ucitamo stablo\r
- BinarnoStablo<Osoba> stablo = io.readStablo(Svetovid.in("Osobe.txt"));\r
-\r
- // Ispisemo ucitano stablo na ekran\r
- Svetovid.out.println("Ucitano stablo:");\r
- io.printStablo(Svetovid.out, stablo);\r
- Svetovid.out.println();\r
-\r
- // Ilustrujemo pozive metoda\r
- \r
- int brojElemenata = stablo.brojElemenata();\r
- Svetovid.out.println();\r
- Svetovid.out.println("Broj elemenata je ", brojElemenata);\r
- \r
- int brojNivoa = stablo.brojNivoa();\r
- Svetovid.out.println("Broj nivoa je ", brojNivoa);\r
-\r
- if (stablo.jePrazno()) {\r
- Svetovid.out.println("Stablo je prazno");\r
- } else {\r
- Svetovid.out.println("Stablo nije prazno");\r
- }\r
- \r
- Osoba o1 = new Osoba("Lazar", "Lazarevic", 1976);\r
- if (stablo.postojiElement(o1)) {\r
- Svetovid.out.println(o1 + " se nalazi u stablu");\r
- } else {\r
- Svetovid.out.println(o1 + " se ne nalazi u stablu");\r
- }\r
-\r
- Osoba najmladji = stablo.min(new KomparatorPoStarosti());\r
- Svetovid.out.println("Najmladja osoba je " + najmladji);\r
-\r
- Osoba najduzePrezime = stablo.max(new KomparatorPoDuziniPrezimena());\r
- Svetovid.out.println("Osoba sa najduzim prezimenom je " + najduzePrezime);\r
-\r
- BinarnoStablo<Osoba> podstablo = stablo.pronadji(o1);\r
- if (podstablo != null) {\r
- Svetovid.out.println("Podstablo sa korenom u " + o1 + ":");\r
- io.printStablo(Svetovid.out, podstablo);\r
- } else {\r
- Svetovid.out.println("Podstablo sa korenom u " + o1 + " je prazno");\r
- }\r
-\r
- Osoba o2 = new Osoba("Krsta", "Krstic", 1988);\r
- boolean ubacili = stablo.ubaci(o1, o2, true);\r
- if (ubacili) {\r
- Svetovid.out.println("Uspesno smo ubacili " + o2 + ":");\r
- } else {\r
- Svetovid.out.println("Nismo uspeli da ubacimo novu osobu");\r
- }\r
-\r
- BinarnoStablo<Osoba> roditelj = stablo.roditeljOd(o1);\r
- if (roditelj != null) {\r
- Svetovid.out.println(o1 + " za roditelja ima " + roditelj);\r
- } else {\r
- Svetovid.out.println(o1 + " nema roditelja");\r
- }\r
-\r
- BinarnoStablo<Osoba> kopija = stablo.kopija();\r
- kopija.setLevoPodstablo(null);\r
- BinarnoStablo<Osoba> obrnuto = stablo.obrnuto();\r
- Svetovid.out.println();\r
- Svetovid.out.println("Kopija stabla (sa odstranjenim levim podstablom):");\r
- io.printStablo(Svetovid.out, kopija);\r
- Svetovid.out.println();\r
- Svetovid.out.println("Obrnuto stablo:");\r
- io.printStablo(Svetovid.out, obrnuto);\r
- Svetovid.out.println();\r
- Svetovid.out.println("Originalno stablo:");\r
- io.printStablo(Svetovid.out, stablo);\r
-\r
- Svetovid.out.println();\r
- Svetovid.out.println("Preorder:");\r
- stablo.stampajPreorder();\r
-\r
- Svetovid.out.println();\r
- Svetovid.out.println("Inorder:");\r
- stablo.stampajInorder();\r
-\r
- Svetovid.out.println();\r
- Svetovid.out.println("Postorder:");\r
- stablo.stampajPostorder();\r
-\r
- Svetovid.out.println();\r
- Svetovid.out.println("Listovi:");\r
- stablo.stampajListove();\r
-\r
- Svetovid.out.println();\r
- Svetovid.out.println("Svi ispod " + o1 + ":");\r
- stablo.stampajSveIspod(o1);\r
-\r
- }\r
-}\r