Árboles n-Arios
Elsa Olivares
Camilo Camargo
Pedro Jaraba
Programación IV
UAC
Generalización
Estructura recursiva en la que cada elemento tiene n árboles n arios asociados.


Conceptos compartidos
Nodo: Elemento del árbol
Raíz: Nodo inicial del árbol
Hoja: Nodo sin hijos
Camino: Todos los nodos entre dos elementos (incluyéndolos)
Rama: Camino entre raíz y una hoja
Altura: Número de nodos en la rama más larga.
Peso: Número de nodos en el árbol
Orden: Número máximo de subarboles asociados.
Ejemplo:

Arbol orden 4
Altura: 4
Peso: 13
Inorden: b, a, e, c, f, j, g, k, l, m, d, h, i
Postorden: b, e, f, c, j, k, l, m, g, h, i, d, a
Preorden: a, b, c, e, f, d, g, j, k, l, m, h, i
Algorítmica
Primer nivel:
- Es el árbol vacío?
- Crea estructura de datos como iterador.
Segundo nivel:
- Planteamiento recursivo
- Se tienen n avances en la recursión.
- Se requiere un ciclo para iterar sobre cada avance.
Implementación
Tad ArbN<E>
{ E obtener(); void setDato(E x); List<ArbN<E>> darHijos(); void enlazar(ArbN<E> x);
boolean esHoja(); }
Ejemplo
public class ArbNEntero implements ArbN<E>
{ //**Atributos** private Integer dato; private List<ArbN<Integer >> hijos; //**Constructor** public ArbNEntero(Integer x) { dato = x; hijos = new ArrayList<<>>(); } //**Metodos interesantes, el resto omitidos**
public void enlazar(ArbN<Integer> r)
{
hijos.add(r);
}
public boolean esHoja()
{
if(hijos.size() == 0)
return true;
else
return false;
} }
Ejemplo Creación

Crear
//*Metodo crear*
public ArbN<Integer> crear()
{
ArbN<Integer> raiz = new ArbNEntero<>(1);
ArbN<Integer> a10 = new ArbNEntero<>(10);
ArbN<Integer> a20 = new ArbNEntero<>(20);
ArbN<Integer> a30 = new ArbNEntero<>(30);
ArbN<Integer> a11 = new ArbNEntero<>(11);
ArbN<Integer> a14 = new ArbNEntero<>(14);
ArbN<Integer> a17 = new ArbNEntero<>(17);
ArbN<Integer> a33 = new ArbNEntero<>(33);
ArbN<Integer> a39 = new ArbNEntero<>(39);
//**Continua siguiente diapositiva**//
Continuación crear
raiz.enlazar(a10);
raiz.enlazar(a20);
raiz.enlazar(a30);
a10.enlazar(a11);
a10.enlazar(a14);
a10.enlazar(a17);
a30.enlazar(a33);
a30.enlazar(a39);
}
Recorrido Preorden
public void impPreorden(ArbN<Integer> r)
{
if(r!=null)
{
System.out.println(""+ r.darElemento());
for(int i=0;i<r.darHijos().size();i++)
{
ArbN<Integer> hijo = r.darHijos().get(i);
impPreorden(hijo);
}
}
}
Recorrido Postorden
public void impPostorden(ArbN<Integer> r)
{
if(r!=null)
{
for(int i=0;i<r.darHijos().size();i++)
{
ArbN<Integer> hijo = r.darHijos().get(i);
impPostorden(hijo);
}
System.out.println(""+ r.darElemento());
}
}
public void impPostorden(ArbN<Integer> r)
{
if(r!=null)
{
for(int i=0;i<r.darHijos().size();i++)
{
ArbN<Integer> hijo = r.darHijos().get(i);
impPostorden(hijo);
}
System.out.println(""+ r.darElemento());
}
}
Recorrido Inorden
public void impInorden(ArbN<Integer> r)
{
if(r!=null)
{
impInorden(r.darHijos().get(0));
System.out.println(""+ r.darElemento());
for(int i=1;i<r.darHijos().size();i++)
{
ArbN<Integer> hijo = r.darHijos().get(i);
impPostorden(hijo);
}
}
}
public void impInorden(ArbN<Integer> r)
{
if(r!=null)
{
impInorden(r.darHijos().get(0));
System.out.println(""+ r.darElemento());
for(int i=1;i<r.darHijos().size();i++)
{
ArbN<Integer> hijo = r.darHijos().get(i);
impPostorden(hijo);
}
}
}
Altura
public int darAltura(ArbN<Integer> r)
{
if(r!=null)
return r.darAltura();
else
return 0;
}
//*Método polimórfico siguiente diapositiva*
Continuación Altura
public int darAltura(ArbN<Integer> r)
{
if(r.esHoja())
return 1;
else
{
int maxAltura = 0;
for(int i=0;i<r.darHijos().size();i++)
{
ArbN<Integer> hijo = r.darHijos().get(i);
int aux = hijo.darAltura();
if(aux > maxAltura)
maxAltura = aux;
}
return maxAltura + 1;
}
}
Bibliografía
http://cupi2.uniandes.edu.co/sitio/images/cursosCupi2/datos/presentaciones/n16_arbolesnarios.pdf
http://www.it.uc3m.es/java/prog/units/arboles/guides/2/guide_es_solution.html
Árboles n-Arios
By Pedro Jaraba
Árboles n-Arios
- 1,526