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.
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);
}
}



