public void porNiveles()
        {
            // Creamos la cola
            Cola <ArbolGeneral <T> > c = new Cola <ArbolGeneral <T> >();

            // Creamos una variable que servirá como auxiliar
            ArbolGeneral <T> arbolAux;

            // Incorporamos al árbol actual a la cola
            c.encolar(this);

            while (!c.esVacia())
            {
                // Se imprime el valor de salida de la cola
                arbolAux = c.desencolar();
                Console.Write(arbolAux.getDatoRaiz() + " ");

                // Si no es hoja, se agregan todos los hijos del árbol actual a la cola
                if (!arbolAux.esHoja())
                {
                    foreach (var hijo in arbolAux.getHijos())
                    {
                        c.encolar(hijo);
                    }
                }
            }
        }
        public void porNivel(int nivel)
        {
            if (nivel % 2 == 0)
            {
                Console.ForegroundColor = ConsoleColor.Red;
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.Blue;
            }
            if (nivel > Game.getEstado().altura())
            {
                Console.ResetColor();
                Console.WriteLine("Profundidad inválida.\n" +
                                  "");
                return;
            }
            Cola <ArbolGeneral <T> > c = new Cola <ArbolGeneral <T> >();
            ArbolGeneral <T>         arbolAux;

            int nivelactual = 0;

            c.encolar(this);
            c.encolar(null);

            while (!c.esVacia())
            {
                arbolAux = c.desencolar();
                if (arbolAux == null)
                {
                    nivelactual += 1;
                    c.encolar(null);
                    if (nivelactual > nivel)
                    {
                        Console.WriteLine("");
                        break;
                    }
                }
                else
                {
                    if (!this.esHoja())
                    {
                        foreach (var hijo in arbolAux.getHijos())
                        {
                            c.encolar(hijo);
                        }
                    }
                    if (nivelactual == nivel)
                    {
                        Console.Write("({0},{1})", arbolAux.getDatoRaiz(), arbolAux.getFuncionHeuristicaRaiz());
                    }
                    if (nivelactual > nivel)
                    {
                        Console.WriteLine("");
                        return;
                    }
                }
            }
            Console.ResetColor();
        }
        public void niveles(int a, int b)
        {
            Cola <ArbolGeneral <T> > cola = new Cola <ArbolGeneral <T> >();
            ArbolGeneral <T>         temp;
            int contNivel = 0;

            cola.encolar(this);
            cola.encolar(null);

            while (!cola.esVacia())
            {
                temp = cola.desencolar();
                if (temp != null)
                {
                    if (contNivel >= a && contNivel <= b)
                    {
                        Console.Write(temp.getDatoRaiz() + " ");
                    }
                    foreach (var hijo in temp.getHijos())
                    {
                        cola.encolar(hijo);
                    }
                }
                else
                {
                    contNivel++;
                    if (!cola.esVacia())
                    {
                        cola.encolar(null);
                    }
                }
            }
        }
        public int ancho()
        {
            Cola <ArbolGeneral <T> > c = new Cola <ArbolGeneral <T> >();
            ArbolGeneral <T>         arbolAux;

            // Inicializamos las variables auxiliares
            int cantArbol = 0, anchoMax = 1;

            // Encolamos el árbol desde donde se invoca la función y el separador de niveles 'null'
            c.encolar(this);
            c.encolar(null);

            // Si el árbol es vacío, se retorna 0
            if (this.esVacio())
            {
                return(0);
            }

            // Si el árbol es hoja, se retorna 1
            if (this.esHoja())
            {
                return(1);
            }

            while (!c.esVacia())
            {
                arbolAux = c.desencolar();

                if (arbolAux == null)                   //Si el árbol desencolado es nulo...
                {
                    if (!c.esVacia())                   // Se encola mientras haya más elementos en la lista
                    {
                        c.encolar(null);
                    }

                    if (cantArbol > anchoMax)
                    {
                        anchoMax = cantArbol;
                    }

                    cantArbol = 0;
                }
                else
                {
                    cantArbol++;

                    if (!arbolAux.esHoja())                       // Si no es hoja, se encolan todos los hijos del árbol
                    {
                        foreach (var hijo in arbolAux.getHijos())
                        {
                            c.encolar(hijo);
                        }
                    }
                }
            }
            return(anchoMax);
        }
        public void porniveles()
        {
            Cola <ArbolGeneral <T> > cola = new Cola <ArbolGeneral <T> >();
            ArbolGeneral <T>         temp;

            cola.encolar(this);
            if (!this.esVacio())
            {
                while (!cola.esVacia())
                {
                    temp = cola.desencolar();
                    Console.Write(temp.getDatoRaiz() + " ");
                    foreach (var hijo in temp.getHijos())
                    {
                        cola.encolar(hijo);
                    }
                }
            }
        }
        public int ancho()
        {
            Cola <ArbolGeneral <T> > cola = new Cola <ArbolGeneral <T> >();
            ArbolGeneral <T>         temp;
            //int contNivel=0;
            int anchoNivel = 0;
            int anchura    = 0;

            cola.encolar(this);
            cola.encolar(null);

            while (!cola.esVacia())
            {
                temp = cola.desencolar();
                if (temp != null)
                {
                    anchoNivel++;
                    foreach (var hijo in temp.getHijos())
                    {
                        cola.encolar(hijo);
                    }
                }
                else
                {
                    //contNivel++;
                    if (anchoNivel > anchura)
                    {
                        anchura = anchoNivel;
                    }
                    anchoNivel = 0;
                    if (!cola.esVacia())
                    {
                        cola.encolar(null);
                    }
                }
            }
            return(anchura);
        }
        public int nivel(T dato)
        {
            Cola <ArbolGeneral <T> > cola = new Cola <ArbolGeneral <T> >();
            ArbolGeneral <T>         temp;
            int contNivel = 0;

            //string data= dato.ToString();
            cola.encolar(this);
            cola.encolar(null);

            while (!cola.esVacia())
            {
                temp = cola.desencolar();

                if (temp != null)
                {
                    //string tempDato= temp.getDatoRaiz().ToString();
                    if (temp.getDatoRaiz().Equals(dato))
                    {
                        return(contNivel);
                    }
                    foreach (var hijo in temp.getHijos())
                    {
                        cola.encolar(hijo);
                    }
                }
                else
                {
                    contNivel++;
                    if (!cola.esVacia())
                    {
                        cola.encolar(null);
                    }
                }
            }
            return(-1);
        }