Implementación de Árbol General Enlazado en Java: Estructura y Operaciones

Design and engineering4.13 KB

Implementación de un Árbol General Enlazado en Java

La clase EnlazadoArbolGeneral<E> implementa la interfaz ArbolGeneral<E> mediante una estructura enlazada de nodos.

Atributos

  • nodoRaiz: referencia al nodo raíz del árbol, de tipo NodoGeneral<E>.

Constructores

El constructor sin parámetros crea un árbol vacío:

public EnlazadoArbolGeneral() {
    nodoRaiz = null;
}

El constructor con parámetros recibe un elemento raíz y un número variable de árboles hijos. Si el arreglo de hijos es null, se lanza una NullPointerException. Si no se proporcionan hijos, se crea un nodo raíz sin descendientes. En caso contrario, los árboles hijos se enlazan como hermanos entre sí y el nodo raíz apunta al primero de ellos como hijo más izquierdo y al último como último hijo.

public EnlazadoArbolGeneral(E elemRaiz, ArbolGeneral<E> ...hijos) throws NullPointerException {
    if (hijos == null)
        throw new NullPointerException();
    if (hijos.length == 0)
        nodoRaiz = new NodoGeneral<E>(elemRaiz, null, null, null);
    else {
        for (int i = 0; i < hijos.length - 1; i++)
            ((EnlazadoArbolGeneral<E>) hijos[i]).nodoRaiz.setHermanoDer(((EnlazadoArbolGeneral<E>) hijos[i + 1]).nodoRaiz);
        nodoRaiz = new NodoGeneral<E>(elemRaiz,
                ((EnlazadoArbolGeneral<E>) hijos[0]).nodoRaiz,
                null,
                ((EnlazadoArbolGeneral<E>) hijos[hijos.length - 1]).nodoRaiz);
    }
}

El constructor privado recibe directamente un nodo y se utiliza internamente para encapsular subárboles.

Métodos de consulta

esVacio()

Indica si el árbol no contiene nodos, es decir, si nodoRaiz es null.

raiz()

Devuelve el elemento almacenado en la raíz. Si el árbol está vacío, lanza una ArbolVacioExcepcion.

esta(E elemento)

Determina si un elemento pertenece al árbol mediante un recorrido recursivo. El método privado esta(NodoGeneral<E> nodo, E elemento) compara el elemento del nodo actual y, si no coincide, recorre sus hijos a través de los hermanos derechos del hijo más izquierdo.

hijoMasIzq()

Retorna un nuevo árbol cuya raíz es el hijo más izquierdo del nodo raíz. Lanza ArbolVacioExcepcion si el árbol está vacío.

hermanoDer()

Retorna un nuevo árbol cuya raíz es el hermano derecho de la raíz actual. Lanza ArbolVacioExcepcion si el árbol está vacío.

Métodos de modificación

setRaiz(E elemRaiz)

Reemplaza el elemento de la raíz. Lanza ArbolVacioExcepcion si el árbol está vacío.

setHijo(ArbolGeneral<E> hijo)

Agrega un subárbol como último hijo de la raíz. Si el árbol está vacío se lanza ArbolVacioExcepcion y si el argumento es null se lanza NullPointerException. Si la raíz no tiene hijos, el nuevo subárbol se convierte en el hijo más izquierdo y en el último hijo; en caso contrario, se enlaza como hermano derecho del último hijo actual y se actualiza la referencia al último hijo.

public void setHijo(ArbolGeneral<E> hijo) throws ArbolVacioExcepcion, NullPointerException {
    if (esVacio())
        throw new ArbolVacioExcepcion("hijo izquierdo: Árbol vacío");
    if (hijo == null)
        throw new NullPointerException();
    if (hijoMasIzq().esVacio()) {
        nodoRaiz.setHijoMasIzq(((EnlazadoArbolGeneral<E>) hijo).nodoRaiz);
        nodoRaiz.setUltimoHijo(((EnlazadoArbolGeneral<E>) hijo).nodoRaiz);
    } else {
        nodoRaiz.getUltimoHijo().setHermanoDer(((EnlazadoArbolGeneral<E>) hijo).nodoRaiz);
        nodoRaiz.setUltimoHijo(((EnlazadoArbolGeneral<E>) hijo).nodoRaiz);
    }
}

suprimir()

Elimina el contenido del árbol asignando null a nodoRaiz, dejándolo vacío.

Download

PDF Word HTML