miércoles, 24 de junio de 2015

Arboles Igual que la lista, el árbol es una estructura de datos. Son muy eficientes para la búsqueda de información. Los árboles soportan estructuras no lineales.










Algunos conceptos de la estructura de datos tipo árbol:

Nodo hoja: Es un nodo sin descendientes (Nodo terminal)
Ej. Nodos E ? F ? C y D.

Nodo interior: Es un nodo que no es hoja.
Ej. Nodos A y B.

Nivel de un árbol: El nodo A está en el nivel 1 sus descendientes directos están en el nivel 2 y así sucesivamente.
El nivel del árbol está dado por el nodo de máximo nivel.
Ej. Este árbol es de nivel 3.

Grado de un nodo: es el número de nodos hijos que tiene dicho nodo (solo se tiene en cuenta los nodos interiores)
Ej. El nodo A tiene grado 3.
El nodo B tiene grado 2.
Los otros nodos no tienen grado porque no tienen descendientes.

Grado de un árbol: Es el máximo de los grados de todos los nodos de un árbol.
Ej. El grado del árbol es 3.

Longitud de camino del nodo x: Al número de arcos que deben ser recorridos para llegar a un nodo x, partiendo de la raiz.
La raiz tiene longitud de camino 1, sus descendientes directos tienen longitud de camino 2, etc. En forma general un nodo en el nivel i tiene longitud de camino i.

Árbol binario: Un árbol es binario si cada nodo tiene como máximo 2 descendientes.









MÉTODOS Y CLASES:

1) NODO DE UN ARBOL:
 
public class Nodo {

    int dato;
    Nodo Hizq, Hder;

    //Constructores
    Nodo(int Elem) {
        dato = Elem;
        Nodo Hizq, Hder = null;
    }

    //Insercion de un elemento
    public void InsertaNodo(int Elem) {
        if (Elem < dato) {
            if (Hizq == null) {
                Hizq = new Nodo(Elem);
            } else {
                Hizq.InsertaNodo(Elem);
            }
        } else {
            if (Elem > dato) {
                if (Hder == null) {
                    Hder = new Nodo(Elem);
                } else {
                    Hder.InsertaNodo(Elem);
                }
            }
        }
    }
}
2) ClASE COLA :
  
public class Cola {

    NodosListaA PrimerNodo;
    NodosListaA UltimoNodo;
    String Nombre;

    //Constructor construye una lista vacia con un nombre de List
    public Cola() {
        this("Lista");
    }

    //Constructor
    public Cola(String s) {
        Nombre = s;
        PrimerNodo = UltimoNodo = null;
    }

    //Retorna True si Lista Vacía
    public boolean VaciaLista() {
        return PrimerNodo == null;
    }

    //Inserta un Elemento al Frente de la Lista
    public void InsertaInicio(Nodo ElemInser) {
        if (VaciaLista()) {
            PrimerNodo = UltimoNodo = new NodosListaA(ElemInser);
        } else {
            PrimerNodo = new NodosListaA(ElemInser, PrimerNodo);
        }
    }

    //Inserta al Final de la Lista
    public void InsertaFinal(Nodo ElemInser) {
        if (VaciaLista()) {
            PrimerNodo = UltimoNodo = new NodosListaA(ElemInser);
        } else {
            UltimoNodo = UltimoNodo.siguiente = new NodosListaA(ElemInser);
        }
    }

    //Eliminar al Inicio
    public void EliminaInicio() {
        if (VaciaLista()) {
            System.out.println("No hay elementos");
        }
        // Restablecer  las referencias de PrimerNodo y UltimoNodo
        if (PrimerNodo.equals(UltimoNodo)) {
            PrimerNodo = UltimoNodo = null;
        } else {
            PrimerNodo = PrimerNodo.siguiente;
        }
    }

    //Elimina al final
    public void EliminaFinal() {
        if (VaciaLista()) {
            System.out.println("No hay elementos");
        }
        // Restablecer  las referencias de PrimerNodo y UltimoNodo
        if (PrimerNodo.equals(UltimoNodo)) {
            PrimerNodo = UltimoNodo = null;
        } else {
            NodosListaA Actual = PrimerNodo;
            while (Actual.siguiente != UltimoNodo) {
                Actual = Actual.siguiente;
            }
            UltimoNodo = Actual;
            Actual.siguiente = null;
        }
    }
}

3) CLASE NODOLISTA:
  */
public class NodosListaA {

    Nodo datos;
    NodosListaA siguiente;

    //Construtor  Crea un nodo del tipo Object
    NodosListaA(Nodo valor) {
        datos = valor;
        siguiente = null;  //siguiente con valor de nulo
    }

    // Constructor Crea un nodo del Tipo Object y al siguiente nodo de la lista
    NodosListaA(Nodo valor, NodosListaA signodo) {
        datos = valor;
        siguiente = signodo; //siguiente se refiere al siguiente nodo
    }
}

5) CLASE ARBOL :
 
  
     public class Arbol {

    Cola Cola = new Cola();
    Nodo Padre;
    Nodo Raiz;

    //Constructor
    public Arbol() {
        Raiz = null;
    }

    //Insercion de un elemento en el arbol
    public void InsertaNodo(int Elem) {
        if (Raiz == null) {
            Raiz = new Nodo(Elem);
        } else {
            Raiz.InsertaNodo(Elem);
        }
    }

    //Preorden Recursivo del arbol
    public void Preorden(Nodo Nodo) {
        if (Nodo == null) {
            return;
        } else {
            System.out.print(Nodo.dato + " ");
            Preorden(Nodo.Hizq);
            Preorden(Nodo.Hder);
        }
    }

    //PostOrden recursivo del arbol
    public void PostOrden(Nodo Nodo) {
        if (Nodo == null) {
            return;
        } else {
            PostOrden(Nodo.Hizq);
            PostOrden(Nodo.Hder);
            System.out.print(Nodo.dato + " ");
        }
    }

    //Inorden Recursivo del arbol
    public void Inorden(Nodo Nodo) {
        if (Nodo == null) {
            return;
        } else {
            Inorden(Nodo.Hizq);
            System.out.print(Nodo.dato + " ");
            Inorden(Nodo.Hder);
        }
    }

    //Busca un elemento en el arbol
    void Busqueda(int Elem, Nodo A) {
        if ((A == null) | (A.dato == Elem)) {
            System.out.print(A.dato + " ");
            return;
        } else {
            if (Elem > A.dato) {
                Busqueda(Elem, A.Hder);
            } else {
                Busqueda(Elem, A.Hizq);
            }
        }
    }

    //Altura del arbol
    public int Altura(Nodo Nodo) {
        int Altder = (Nodo.Hder == null ? 0 : 1 + Altura(Nodo.Hder));
        int Altizq = (Nodo.Hizq == null ? 0 : 1 + Altura(Nodo.Hizq));
        return Math.max(Altder, Altizq);
    }

    //Recorrido en anchura del arbol
    public void Anchura(Nodo Nodo) {
        Cola cola = new Cola();
        Nodo T = null;
        System.out.print("El recorrido en Anchura es: ");
        if (Nodo != null) {
            cola.InsertaFinal(Nodo);
            while (!(cola.VaciaLista())) {
                T = cola.PrimerNodo.datos;
                cola.EliminaInicio();
                System.out.print(T.dato + " ");
                if (T.Hizq != null) {
                    cola.InsertaFinal(T.Hizq);
                }
                if (T.Hder != null) {
                    cola.InsertaFinal(T.Hder);
                }
            }
        }
        System.out.println();
    }

   
}

6) CLASE PRINCIPAL:
 
  public class ArbolesDaniel {

    public static void main(String[] args) {
        Arbol A = new Arbol();
        A.InsertaNodo(10);
        A.InsertaNodo(7);
        A.InsertaNodo(8);
        A.InsertaNodo(6);
        A.InsertaNodo(12);
        A.InsertaNodo(11);
        A.InsertaNodo(5);
        A.InsertaNodo(4);
        A.InsertaNodo(3);
        A.InsertaNodo(2);
        System.out.print("El recorrido en Preorden es: ");
        A.Preorden(A.Raiz);
        System.out.println();
        System.out.print("El recorrido en Inorden es: ");
        A.Inorden(A.Raiz);
        System.out.println();
        System.out.print("El recorrido en Postorden es: ");
        A.PostOrden(A.Raiz);
        System.out.println();
        System.out.println("La altura del arbol es: " + A.Altura(A.Raiz));
        A.Anchura(A.Raiz);
    }
}

miércoles, 17 de junio de 2015

COLAS Las colas son estructuras de datos lineales, son muy parecidas a las pilas y a las listas , quienes les dan propiedades a esta estructura de datos. En las colas se accede por uno de los dos extremos de la lista y los elementos se insertan por el extremo final, y se suprimen por el otro extremo, llamado frente. Estas estructuras se utilizan para almacenar elementos en su orden de aparición. 

TIPOS DE COLAS:
- Cola Simple: Estructura donde los elementos salen en el mismo orden en el que llegan.
- Cola Doble: Estructura en la que los elementos se pueden añadir o quitar por cualquier extremo de la cola.
- Cola Circular: Representación de una cola simple en un arreglo.

- Cola de prioridades: Estructura en la cual los elementos se insertan en cualquier posición de la cola y se mueven solo por el frente.




Para poder entender las colas veremos sus métodos y clases para poder aplicar esta estructura de datos


MÉTODOS Y CLASES:

1) NODO DE UNA COLA:
 class Nodo {
        private int informacion;
        Nodo siguiente;
    }
2) ClASE COLA :
  
private Nodo inicio;
private Nodo fin;
    
    Cola() {
        inicio=null;
        fin=null;
    }
3) MÉTODO DE VERIFICAR SI LA COLA ESTA LLENA:
  
public boolean vacia (){
        if (inicio == null)
            return true;
        else
            return false;
    }

4) MÉTODO INSERTAR ELEMENTO EN COLA:
 public void insertarElemento (int informacion)
    {
        Nodo nuevo;
        nuevo = new Nodo ();
        nuevo.informacion = informacion;
        nuevo.siguiente = null;
        if (vacia ()) {
            inicio = nuevo;
            fin = nuevo;
        } else {
            fin.sig = nuevo;
            fin = nuevo;
        }
    }
5) MÉTODO PARA EXTRAER UN ELEMENTO :
 
  
      public int extraer ()
    {
        if (!vacia ())
        {
            int informacion = inicio.informacion;
            if (inicio == fin){
                inicio = null;
                fin = null;
            } else {
                inicio = inicio.siguiente;
            }
            return informacion;
        } else
            return Integer.MAX_VALUE;
    }
6) MÉTODO PARA IMPRIMIR ELEMENTOS DE UNA COLA :
 
  public void imprimir() {
        Nodo aux=inicio;
        System.out.println("Los elementos de la cola son:");
        while (aux!=null) {
            System.out.print(aux.informacion+"-");
            aux=aux.siguiente;
        }
        System.out.println();
    }
EJERCICIO PRACTICO APLICANDO LOS MÉTODOS EXPLICADOS CLASE COLA:
 
public class Cola {

    private Nodo inicio;
    private Nodo fin;

    public Cola() {
        inicio = null;
        fin = null;
    }

    public boolean vacia() {
        if (inicio == null) {
            return true;
        } else {
            return false;
        }
    }

    public void insertarElemento(int informacion) {
        Nodo nuevo;
        nuevo = new Nodo();
        nuevo.informacion = informacion;
        nuevo.siguiente = null;
        if (vacia()) {
            inicio = nuevo;
            fin = nuevo;
        } else {
            fin.siguiente = nuevo;
            fin = nuevo;
        }
    }

    public int extraer() {
        if (!vacia()) {
            int informacion = inicio.informacion;
            if (inicio == fin) {
                inicio = null;
                fin = null;
            } else {
                inicio = inicio.siguiente;
            }
            return informacion;
        } else {
            return Integer.MAX_VALUE;
        }
    }

    public void imprimir() {
        Nodo aux = inicio;
        System.out.println("Los elementos de la cola son:");
        while (aux != null) {
            System.out.print("/"+aux.informacion + "/");
            aux = aux.siguiente;
        }
        System.out.println();
    }

}

CLASE NODO :
 
public class Nodo {
     int informacion;
     Nodo siguiente;

    public Nodo() {
    }

    public Nodo(int informacion, Nodo siguiente) {
        this.informacion = informacion;
        this.siguiente = siguiente;
    }

    public int getInformacion() {
        return informacion;
    }

    public void setInformacion(int informacion) {
        this.informacion = informacion;
    }

    public Nodo getSiguiente() {
        return siguiente;
    }

    public void setSiguiente(Nodo siguiente) {
        this.siguiente = siguiente;
    }

    @Override
    public String toString() {
        return "Nodo{" + "informacion=" + informacion + ", siguiente=" + siguiente + '}';
    }
     
}

CLASE PRINCIPAL
 

public class Principal {

   
      public static void main(String[] ar) {
        Cola cola1=new Cola();
        cola1.insertarElemento(14);
        cola1.insertarElemento(12);
        cola1.insertarElemento(5);
        cola1.insertarElemento(45);
        cola1.insertarElemento(3);
        cola1.insertarElemento(10);
        cola1.imprimir();
        System.out.println("Extraemos uno de la cola:"+cola1.extraer());
        cola1.imprimir();        
    }
}