class ArbolCadenas {
   private NodoCadena raiz;

   public ArbolCadenas() {

   }

   public boolean existe(String busqueda) {
      return existe(this.raiz, busqueda);
   }

   private boolean existe(NodoCadena n, String busqueda) {
      if (n == null) {
         return false;
      }
      if (n.getDato().equals(busqueda)) {
         return true;
      } else if (busqueda.compareTo(n.getDato()) < 0) {
         return existe(n.getIzquierda(), busqueda);
      } else {
         return existe(n.getDerecha(), busqueda);
      }

   }

   public void insertar(String dato) {
      if (this.raiz == null) {
         this.raiz = new NodoCadena(dato);
      } else {
         this.insertar(this.raiz, dato);
      }
   }

   private void insertar(NodoCadena padre, String dato) {
      if (dato.compareTo(padre.getDato()) > 0) {
         if (padre.getDerecha() == null) {
            padre.setDerecha(new NodoCadena(dato));
         } else {
            this.insertar(padre.getDerecha(), dato);
         }
      } else {
         if (padre.getIzquierda() == null) {
            padre.setIzquierda(new NodoCadena(dato));
         } else {
            this.insertar(padre.getIzquierda(), dato);
         }
      }
   }

   private void preorden(NodoCadena n) {
      if (n != null) {
         n.imprimirDato();
         preorden(n.getIzquierda());
         preorden(n.getDerecha());
      }
   }

   private void inorden(NodoCadena n) {
      if (n != null) {
         inorden(n.getIzquierda());
         n.imprimirDato();
         inorden(n.getDerecha());
      }
   }

   private void postorden(NodoCadena n) {
      if (n != null) {
         postorden(n.getIzquierda());
         postorden(n.getDerecha());
         n.imprimirDato();
      }
   }

   public void preorden() {
      this.preorden(this.raiz);
   }

   public void inorden() {
      this.inorden(this.raiz);
   }

   public void postorden() {
      this.postorden(this.raiz);
   }


   public static void main(String[] argumentos) {
      ArbolCadenas arbolCadenas = new ArbolCadenas();
      arbolCadenas.insertar("Luis");
      arbolCadenas.insertar("Chris");
      arbolCadenas.insertar("Zelda");
      arbolCadenas.insertar("Cuphead");
      arbolCadenas.insertar("Leon");
      System.out.println("Recorriendo inorden:");
      arbolCadenas.inorden();
      System.out.println("Recorriendo postorden:");
      arbolCadenas.postorden();
      System.out.println("Recorriendo preorden:");
      arbolCadenas.preorden();
      System.out.println(arbolCadenas.existe("Luis")); // true
      System.out.println(arbolCadenas.existe("Claire")); // false
      System.out.println(arbolCadenas.existe("Zelda")); // true
   }
}
