import java.util.Random;

public class Arbol 
{
	private Nodo raiz= null;
	
	private int contadorDeElementos= 0;
	
	private class Nodo
	{
		public int valor= 0;
		
		private Nodo padre= null;
		
		private Nodo hijoDerecho= null;
		
		private Nodo hijoIzquierdo= null;
		
		public String marca= " ";
		
		public Nodo(int value)
		{
			this.valor= value;
		}
		
		public Nodo getHijoIzquierdo()
		{
			return this.hijoIzquierdo;
		}
		
		public Nodo getHijoDerecho()
		{
			return this.hijoDerecho;
		}
		
		public void setPadre(Nodo padre)
		{
			this.padre= padre;
		}
		
		public void setMarca(String marca)
		{
			this.marca= marca;
		}
		
		public void insertar(int valor)
		{
			Random random= new Random();
			
			System.out.printf("%s%d ", this.marca, this.valor);
			
			if(valor == this.valor)
			{
				
			}
			else if(random.nextBoolean())
			{
				if(this.hijoIzquierdo == null)
				{
					this.hijoIzquierdo= new Nodo(valor);
					this.hijoIzquierdo.setPadre(this);
					this.hijoIzquierdo.setMarca("-");
					System.out.printf("%s%d ", this.hijoIzquierdo.marca, this.hijoIzquierdo.valor);
				}
				else
				{
					this.hijoIzquierdo.insertar(valor);
				}
			}
			else
			{
				if(this.hijoDerecho == null)
				{
					this.hijoDerecho= new Nodo(valor);
					this.hijoDerecho.setPadre(this);
					this.hijoDerecho.setMarca("+");
					System.out.printf("%s%d ", this.hijoDerecho.marca, this.hijoDerecho.valor);
				}
				else
				{
					this.hijoDerecho.insertar(valor);
				}
			}
		}
		
		public int nivel(int valor)
		{
			int cuenta= 0;
			
			if(valor== this.valor)
			{
				cuenta++;
			}
			else
			{
				int alturaIzquierda= 0;
				int alturaDerecha= 0;
				
				if(this.hijoIzquierdo != null)
				{
					alturaIzquierda= this.hijoIzquierdo.nivel(valor);
				}
				if (this.hijoDerecho != null)
				{
					alturaDerecha= this.hijoDerecho.nivel(valor);
				}
				
				cuenta+= Math.max(alturaIzquierda, alturaDerecha);
				cuenta++;
			}
			
			return cuenta;
		}
	}
	
	public void reiniciar()
	{
		this.raiz= null;
	}
	
	public int nivel(int valor)
	{
		int cuenta= 0;
		
		if(this.contadorDeElementos== 0)
		{
			System.out.println("-1");
		}
		else if(this.contadorDeElementos== 1)
		{
			System.out.println("0");
		}
		else
		{
			cuenta+= this.raiz.nivel(valor);
		}
		return cuenta;
	}
	
	public void insert(int valor)
	{
		if(this.raiz== null)
		{
			this.raiz= new Nodo(valor);
			System.out.printf("%s%d%n ", this.raiz.marca, this.raiz.valor);
		}
		else
		{
			this.raiz.insertar(valor);
		}
		
		this.contadorDeElementos++;
	}
}
