gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Primer implementacije binarnih stabala sa opstim tipom podataka
[spa2-materijali.git] / Stabla / StabloOpstegTipa / StabloProgram.java
diff --git a/Stabla/StabloOpstegTipa/StabloProgram.java b/Stabla/StabloOpstegTipa/StabloProgram.java
new file mode 100644 (file)
index 0000000..2594334
--- /dev/null
@@ -0,0 +1,167 @@
+import java.util.NoSuchElementException;\r
+//@interface DatoNaVezbama {}\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
+  //  @DatoNaVezbama\r
+    // Metod koji zapravo resava dati problem\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
+   @DatoNaVezbama\r
+    // Metod koji zapravo resava dati problem\r
+       protected static int brojNivoa(Cvor 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
+\r
+// Glavna klasa\r
+public class StabloProgram {\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
+               io.printStablo(Svetovid.out, stablo);\r
+               Svetovid.out.println();\r
+\r
+               // Ilustrujemo poziv metoda\r
+               \r
+               int brojElemenata = stablo.brojElemenata();\r
+               Svetovid.out.println("Broj elemenata:", brojElemenata);\r
+               \r
+               int brojNivoa = stablo.brojNivoa();\r
+               Svetovid.out.println("Broj nivoa:", brojNivoa);\r
+\r
+               // TODO Dodati pozive ostalih metoda\r
+\r
+       }\r
+}\r
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner