package vsevenem;

public class Drevo<T> {
	private T vsebina; // v praznem je null, v nepraznem ni null
	private Drevo<T> levo; // v nepraznem drevesu ne sme biti null
	private Drevo<T> desno; // v nepraznem drevesu ne sme biti null
	
	
	/**
	 * Novo prazno drevo.
	 */
	public Drevo() {
		this.vsebina = null;
		this.levo = null;
		this.desno = null;
	}
	
	/**
	 * Naredi list (drevo s praznima poddrevesoma).
	 * @param vsebina
	 */
	public Drevo(T vsebina) {
		this(); // pokliči konstruktor Drevo()
		this.setVsebina(vsebina);
	}

	/**
	 * Naredi setavljeno drevo z dano vsebino in poddrevesoma
	 * @param vsebina
	 * @param levo
	 * @param desno
	 */
	public Drevo(T vsebina, Drevo<T> levo, Drevo<T> desno) {
		this.vsebina = vsebina;
		this.levo = levo;
		this.desno = desno;
	}
	
	@Override
	public String toString() {
		return "Drevo [vsebina=" + vsebina + ", levo=" + levo + ", desno=" + desno + "]";
	}

	/**
	 * @return ali je drevo prazno
	 */
	public boolean isPrazno() {
		return (this.vsebina == null);
	}

	/**
	 * @return vrne vsebino ali null, če je drevo prazno
	 */
	public T getVsebina() {
		return vsebina;
	}

	/**
	 * @param vsebina nova vsebina, ne sme biti null
	 */
	public void setVsebina(T vsebina) {
		if (this.isPrazno()) {
			this.vsebina = vsebina;
			this.levo = new Drevo<T>();
			this.desno = new Drevo<T>();
		} else {
			this.vsebina = vsebina;
		}
	}

	/**
	 * @return vrni desno poddrevo ali null, če je this prazno drevo
	 */
	public Drevo<T> getDesno() {
		return desno;
	}

	/**
	 * Te metode ne smemo klicati na praznem drevesu.
	 * 
	 * @param desno novo desno poddrevo
	 */
	public void setDesno(Drevo<T> desno) {
		this.desno = desno;
	}

	/**
	 * @return vrni levo poddrevo ali null, če je this prazno drevo
	 */
	public Drevo<T> getLevo() {
		return levo;
	}

	/**
	 * Te metode ne smemo klicati na praznem drevesu.
	 * 
	 * @param levo novo levo poddrevo
	 */
	public void setLevo(Drevo<T> levo) {
		this.levo = levo;
	}	
}
