Advertisement
niske

Stablo Baki

Dec 4th, 2024 (edited)
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.91 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Comparator;
  3. import java.util.List;
  4. import java.util.Objects;
  5.  
  6. class StabloOsoba {
  7.  
  8.     // Tip koji opisuje jedan cvor u stablu
  9.     protected static class Cvor {
  10.  
  11.         // Sadrzaj cvora
  12.         public Osoba osoba;
  13.  
  14.         // Levo i desno podstablo
  15.         public Cvor levo;
  16.         public Cvor desno;
  17.  
  18.         // Jedini konstruktor
  19.         public Cvor(Osoba osoba, Cvor levo, Cvor desno) {
  20.             this.osoba = osoba;
  21.             this.levo = levo;
  22.             this.desno = desno;
  23.         }
  24.     }
  25.  
  26.     // Stablo ima referencu na korenski cvor
  27.     protected final Cvor koren;
  28.  
  29.     // Kreiramo prazno stablo
  30.     public StabloOsoba() {
  31.         koren = null;
  32.     }
  33.  
  34.     // Kreiramo stablo sa jednom osobom u korenu
  35.     // i praznim levim i desnim podstablom
  36.     public StabloOsoba(Osoba osoba) {
  37.         koren = new Cvor(osoba, null, null);
  38.     }
  39.  
  40.     // Specijalan konstruktor koji koriste neki metodi ove klase
  41.     protected StabloOsoba(Cvor koren) {
  42.         this.koren = koren;
  43.     }
  44.    
  45.     public boolean jePrazno() {
  46.         return this.koren == null;
  47.     }
  48.    
  49.     public boolean postojiElement(Cvor cvor, Osoba element) {
  50.         if(cvor == null)
  51.             return false;
  52.         if(cvor.osoba.equals(element))
  53.             return true;
  54.  
  55.         boolean nadjenLevo = postojiElement(cvor.levo, element);
  56.         if (nadjenLevo) {
  57.             return nadjenLevo;
  58.         }
  59.        
  60.         boolean nadjenDesno = postojiElement(cvor.desno, element);
  61.         if (nadjenDesno) {
  62.             return nadjenDesno;
  63.         }
  64.        
  65.         return false;
  66.     }
  67.    
  68.     public void stampajPreorder(Cvor cvor) {
  69.         if(cvor == null)
  70.             return;
  71.         System.out.println(cvor.osoba);
  72.         stampajPreorder(cvor.levo);
  73.         stampajPreorder(cvor.desno);
  74.        
  75.     }
  76.    
  77.     public void stampajInOrder(Cvor cvor){
  78.         if(cvor == null)
  79.             return;
  80.        
  81.         stampajInOrder(cvor.levo);
  82.         System.out.println(cvor.osoba);
  83.         stampajInOrder(cvor.desno);
  84.        
  85.     }
  86.  
  87.     public void stampajPostOrder(Cvor cvor){
  88.         if(cvor == null)
  89.             return;
  90.        
  91.         stampajPostOrder(cvor.levo);
  92.         stampajPostOrder(cvor.desno);
  93.         System.out.println(cvor.osoba);
  94.        
  95.     }
  96.    
  97.     public void stampajListove(Cvor cvor) {
  98.         if(cvor == null)
  99.             return;
  100.         if(cvor.levo == null && cvor.desno == null)
  101.             System.out.println(cvor.osoba);
  102.        
  103.         stampajListove(cvor.levo);
  104.         stampajListove(cvor.desno);
  105.        
  106.     }
  107.    
  108.     private StabloOsoba pronadji(Osoba element) {
  109.         if(element == null)
  110.             return null;
  111.         else
  112.             return pronadji(this.koren, element);
  113.     }
  114.    
  115.     private StabloOsoba pronadji(Cvor cvor, Osoba element) {   
  116.         if(cvor == null)
  117.             return null;
  118.         if(cvor.osoba.equals(element))
  119.             return new StabloOsoba(cvor);
  120.        
  121.         StabloOsoba stabloLevo = pronadji(cvor.levo, element);
  122.         if (stabloLevo != null) {
  123.             return stabloLevo;
  124.         }
  125.        
  126.         StabloOsoba stabloDesno = pronadji(cvor.desno, element);
  127.         if (stabloDesno != null) {
  128.             return stabloDesno;
  129.         }
  130.        
  131.         return null;
  132.     }
  133.    
  134.     public List<Osoba> stampajSveIspod(Osoba element){
  135.         if(element == null)
  136.             return null;
  137.        
  138.         StabloOsoba korenElementa = pronadji(element);
  139.  
  140.         return stampajSveIspod(new ArrayList<Osoba>(), korenElementa.koren);
  141.            
  142.     }
  143.    
  144.     private List<Osoba> stampajSveIspod(List<Osoba> lista, Cvor cvor){
  145.         if(cvor == null)
  146.             return null;
  147.        
  148.         lista.add(cvor.osoba);
  149.        
  150.         stampajSveIspod(lista ,cvor.levo);
  151.         stampajSveIspod(lista ,cvor.desno);
  152.        
  153.         return lista;
  154.     }
  155.    
  156.     public boolean ubaci(Osoba roditelj, Osoba potomak, boolean levo) {
  157.         if(roditelj == null || potomak == null)
  158.             return false;
  159.         StabloOsoba stablo = pronadji(roditelj);
  160.         Cvor cvor = stablo == null ? null : stablo.koren;
  161.        
  162.         if(cvor == null)
  163.             return false;
  164.        
  165.         if(cvor.desno != null || cvor.levo != null)
  166.             return false;
  167.         return ubaci(this.koren,roditelj, potomak, levo);
  168.     }
  169.    
  170.     private boolean ubaci(Cvor cvor, Osoba roditelj, Osoba potomak, boolean levo) {
  171.         if(cvor == null)
  172.             return false;
  173.        
  174.         if(roditelj.equals(cvor.osoba))
  175.             return true;
  176.        
  177.         //Verovatno sam ga zakomplikovao, ali barem radi <3
  178.         boolean nadjenLevo = ubaci(cvor.levo, roditelj, potomak, levo);
  179.         if (nadjenLevo) {
  180.             if(levo)
  181.                 cvor.levo.levo = new Cvor(potomak, null, null);
  182.             else
  183.                 cvor.levo.desno = new Cvor(potomak, null, null);
  184.             return nadjenLevo;
  185.         }
  186.        
  187.         boolean nadjenDesno = ubaci(cvor.desno, roditelj, potomak, levo);
  188.         if (nadjenDesno) {
  189.             if(levo)
  190.                 cvor.desno.levo = new Cvor(potomak, null, null);
  191.             else
  192.                 cvor.desno.desno = new Cvor(potomak, null, null);
  193.             return nadjenDesno;
  194.         }
  195.        
  196.         return false;
  197.     }
  198.  
  199.     public Osoba roditeljOd(Osoba potomak) {
  200.         if(this.koren.osoba.equals(potomak) || koren == null)
  201.             return null;
  202.         return roditeljOd(this.koren, potomak);
  203.     }
  204.    
  205.     private Osoba roditeljOd(Cvor cvor, Osoba potomak) {
  206.         if(cvor == null)
  207.             return null;
  208.         /*
  209.         Prvo proveravamo da li postoji osoba na levoj ili desnoj grani.
  210.         Ovo radimo da nam ne bi izbacio null-point-exception u slucajevima kada
  211.         postoji ili samo leva ili samo desna osoba.
  212.         Ovo radimo preko "lenjog izracunavanja", ako vidi da nema osobe na nekoj strani
  213.         on nece ni proveravati da li je na toj strani potomak!
  214.          */
  215.         if((cvor.levo != null && cvor.levo.osoba.equals(potomak))||
  216.                 (cvor.desno != null && cvor.desno.osoba.equals(potomak)))
  217.             return cvor.osoba;
  218.        
  219.         Osoba leva = roditeljOd(cvor.levo, potomak);
  220.         if(leva != null)
  221.             return leva;
  222.        
  223.         Osoba desna = roditeljOd(cvor.desno, potomak);
  224.         if(desna != null)
  225.             return desna;
  226.        
  227.         return null;
  228.     }
  229.  
  230.     public Osoba optimalnaOsoba(Comparator<Osoba> komparator, Cvor cvor) {
  231.         return null;
  232.     }
  233.    
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement