/**
 * BSTree.java
 *
 * Stablo binarnog pretrazivanja.
 * Kljucevi u stablu se porede na 
 * osnovu njihovog leksikografskog poretka.
 */

package BinarySearchTree;


public class BSTree {
    
    public TreeNode root;    // koren stabla
    
    public int size;         // broj cvorova u stablu
    
    /**
     * Konstruktori klase BSTree
     */
    public BSTree() {
        size = 0;
        root = null;
    }
    public BSTree(String key) {
        root = new TreeNode(key);
        size = 1;
    }
    
    public BSTree(TreeNode root) {
        this.root = root;
        size = 1;
    }
    
    /** 
     * Pretrazivanje stabla na odredjenu vrednost kljuca.
     * Povratna vrednost: cvor u kojem se nalazi trazeni kljuc
     * ili null ako se kljuc ne nalazi u stablu.
     */
    public TreeNode searchKey(String key) {
    	
    	// IMPLEMENTIRATI
    	
    }
    
    /** 
     * Umetanje cvora sa novom vrednoscu kljuca.
     * Argument key je vrednost kljuca koji treba umetnuti.
     * Duplikati kljuceva nisu dozvoljeni.
     * m == true ako zelimo da se na izlaz ispisuje poruka pri pokusaju
     * umetanja vec postojeceg kljuca.
     * m == false ako NE zelimo da se na izlaz ispisuje poruka pri pokusaju
     * umetanja vec postojeceg kljuca.
     *
     * Celobrojna povratna vrednost je kod uspesnosti operacije umetanja
     * return 0;  - umetanje uspesno 
     * return 1;  - umetanje neuspesno, kljuc vec postoji u stablu
     */
    public int insert(String key, boolean m) {
    	
    	// IMPLEMENTIRATI
       
    }
    
    /** 
     * Umetanje novog cvora newNode u stablo.
     * Cvor ne sme imati kljuc koji vec postoji u stablu.
     * m == true ako zelimo da se na izlaz ispisuje poruka pri pokusaju
     * umetanja cvora koji sadrzi vec postojeci kljuc.
     * m == false ako NE zelimo da se na izlaz ispisuje poruka pri pokusaju
     * umetanja cvora koji sadrzi vec postojeci kljuc.
     *
     * Celobrojna povratna vrednost je kod uspesnosti operacije umetanja
     * return 0;  - umetanje uspesno 
     * return 1;  - umetanje neuspesno, kljuc vec postoji u stablu
     */
    public int insert(TreeNode newNode, boolean m) {
    	
    	// IMPLEMENTIRATI
        
    }
    
    /** 
     * Brisanje cvora sa vrednoscu kljuca key.
     * m == true ako zelimo da se na izlaz ispisuje poruka pri pokusaju
     * brisanja kljuca koji se ne nalazi u stablu.
     * m == false ako NE zelimo da se na izlaz ispisuje poruka pri pokusaju
     * brisanja kljuca koji se ne nalazi u stablu.
     *
     * Celobrojna povratna vrednost je kod uspesnosti operacije brisanja.
     * return 0;  - cvor sa zadatim kljucem je obrisan 
     * return 1;  - brisanje neuspesno, zadati kljuc se ne nalazi u stablu
     */
    public int delete(String key, boolean m) {
    	
    	// IMPLEMENTIRATI
        
    }
    
/** 
 * Pronalazenje cvora sa minimalnom vrednoscu kljuca u stablu ciji je
 * koren cvor subtreeRoot.
 *
 * Povratna vrednost: pronadjeni cvor ili null ako je stablo prazno.
 */    
public static TreeNode getMinimalKeyInSubtree(TreeNode subtreeRoot) {
	
	// IMPLEMENTIRATI
	
}    

/**
 * Pronalazenje cvora sa maksimalnom vrednoscu kljuca u stablu ciji je
 * koren cvor subtreeRoot.
 *
 * Povratna vrednost: pronadjeni cvor ili null ako je stablo prazno.
 */
public static TreeNode getMaximalKeyInSubtree(TreeNode subtreeRoot) {
	
	// IMPLEMENTIRATI
	
}   

/**
 * Pronalazenje sledbenika zadatog cvora r u stablu.
 * Sledbenik zadatog cvora je cvor sa najmanjim kljucem koji je veci od
 * kljuca datog cvora.
 *
 * Povratna vrednost: pronadjeni cvor ili null ako cvor r nema sledbenika.
 */
public static TreeNode getSuccessor(TreeNode r) {
	
	// IMPLEMENTIRATI
	
}

/**
 * Pronalazenje prethodnika zadatog cvora r u stablu.
 * Prethodnik zadatog cvora je cvor sa najvecim kljucem koji je manji od
 * kljuca datog cvora.
 *
 * Povratna vrednost: pronadjeni cvor ili null ako cvor r nema prethodnika.
 */
public static TreeNode getPredecessor(TreeNode r) {
	
	// IMPLEMENTIRATI
	
}

    
    
}
