Está en la página 1de 8

Arboles binarios

Un rbol es una estructura dinmica no lineal ; Se define como una estructura homognea de tipo T con un
nmero finito de rboles disjuntos llamados subrboles

-las caractersticas de un rbol


a) Todo rbol que no es vaco tiene un nico nodo de raz
b) un nodo x es descendiente directo de un nodo Y x es hijo de Y
c) un nodo x es un antecesor de un nodo Y
x es padre de y
d) todos los hijos descendientes de un solo nodo son hermanos
c) todo nodo que no tiene nodos descendientes se denominan NODO DE HOJA o TERMINAL
f) todo no que no es raz ni terminal es un Nodo Interior
g) GRADO es el NMERO de descendientes directos que tiene un nodo
h) GRADO DEL RBOL es el mximo grado de todos los nodos de rbol
i) Nivel es el nmero de arcos que deben ser recorridos para llegar a un determinado nodo
j) Altura del rbol es el mximo nmero de niveles de todo el nodo del rbol

rboles Binarios
Un rbol binario cada nodo puede tener como mximo dos subrboles y siempre es necesario distinguir entre
el subrbol izquierdo y el subrbol derecho
rbol binario tipo T es una estructura homognea que es la concatenacin de un elemento tipo T, llamado raz,
con dos rboles binarios disjuntos, llamados subrbol izquierdo y subrbol derecho.
Se pueden aplicar para representar un arbol genealgico o para representar expresiones algebraicas
construidas con operadores binarios
Distintos. Cuando sus estructuras son diferentes
Similares. Cuando sus estructuras son idnticas pero la informacin que contiene cada rbol es diferente.
Equivalentes. Cuando son similares y adems la informacin es idntica entre los dos rboles.
Se dice que un rbol binario est lleno si es un rbol binario de profundidad k que tiene (2^k) - 1 nodos.

Un

rbol binario lleno es aquel que contiene el nmero mximo de posibles nodos. Como en estos casos no existen
subrboles vacos excepto para los nodos terminales.
Un rbol binario con n nodos y profundidad k se dice que es completo si y slo si sus nodos se corresponden
con los nodos numerados de 1 a n en el rbol binario lleno de profundidad k. Definimos un rbol binario
completo (ABC) como un A .B .lleno pero con sus hojas dispuestas de tal manera que las hojas del nivel ms bajo
estn situadas tan a la izquierda como sea posible.

Recorridos sistemticos.
Una de las operaciones ms importantes que se realiza en un rbol binario es el recorrido de los mismos. Recorrer
significa visitar los nodos del rbol en forma ordenada, de tal manera que todos los nodos del mismo sean
visitados una sola vez. Existen tres formas diferentes de efectuar el recorrido y todas Ellas de naturaleza recursiva;
estas son:
a) Recorrido en preorden
Visitar la raz
Recorrer el subrbol izquierdo
Recorrer el subrbol derecho
b) Recorrido en inorden
Recorrer el subrbol izquierdo
Visitar la raz
Recorrer el subrbol derecho
c) Recorrido en Posorden
Recorrer el subrbol izquierdo
Recorrer el subrbol derecho
Visitar la raz

Procedimiento
Comenc creando la clase nodo que define un nodo como un tipo de dato que contiene 1 dato y sus
respectivas 2 conexiones (izquierda y derecha)
Despus se comenz definir la clase rbol Binario en la cual damos los parmetros iniciales como establecer la
raz del rbol a nulo y definir los mtodos de escritura

Mtodos de recorrido en mi caso defin 3 metodos de recorrido los cules son


recursivos

public void RPreOrden(Nodo raiz) {


if (raiz == null) {
return;
}
System.out.println(raiz.getValor());
RPreOrden(raiz.getIzquierda());
RPreOrden(raiz.getDerecha());
}

public void RPosOrden(Nodo raiz){


if (raiz == null) {
return;
}
RPosOrden(raiz.getIzquierda());
RPosOrden(raiz.getDerecha());
System.out.println(raiz.getValor());
}

public void RInOrden(Nodo raiz) {


if (raiz == null) {
return;
}
RInOrden(raiz.getIzquierda());
System.out.println(raiz.getValor());
RInOrden(raiz.getDerecha());
}

Ejemplo de ejecucin
Un ejemplo de ejecucin del programa son los 2 siguientes el primero es creando un rbol con nmeros

Donde el rbol quedara de la siguiente forma


De acuerdo a los datos introducidos por teclado

Recorrido en pre orden

Recorrido Inorden

Recorrido Pos orden

ARBOL DE STRINGS

Recorrido en pre orden

Recorrido Inorden

Recorrido Pos orden

Bsqueda en un rbol:
El algoritmo de busque principalmente visita la raz de este, si el elemento que
buscamos est en la raz entonces la bsqueda termina pero si no, si es ms
grande visita primero el subrbol derecho y si es ms chico visita el subrbol
izquierdo principalmente se usa de manera recursiva ya que necesitamos visitar
el mismo rbol aunque tambin se puede hacer de forma iterativa
O en forma de seudocdigo
boolean buscar(tarbol *a, elem)
{
if (a == NULL) return FALSE;
else if (a->clave < elem) return buscar(a->der, elem);
else if (a->clave > elem) return buscar(a->izq, elem);
else return TRUE;
}
Ejemplo de ejecucin

*/////*arbol creado*//////*
recorrido PreOrden
Hola
esto
es
un
rbol
*/////* recorrido InOrden */////*
es
arbol
un
esto
Hola
*/////recorrido PosOrden*/////
arbol
un
es
esto
Hola
*/////buscando en el rbol el nodo esto*/////
comprobacion exitosa se encontro el Nodo:esto

Insercin en un rbol:

Para insertar un elemento nos basamos en el algoritmo de bsqueda. Si el elemento est en


el rbol no lo insertaremos. Si no lo est, lo insertaremos a continuacin del ltimo nodo
visitado.
Necesitamos un puntero auxiliar para
conservar una referencia al padre del nodo
raz actual. El valor inicial para ese puntero es
NULL.
RAIZ = NULL
nodo = Raiz
Bucle: mientras actual no sea un rbol vaco o
hasta que se encuentre el elemento.
Si el valor del nodo raz es mayor que el
elemento que buscamos, continuaremos la
bsqueda en el rbol izquierdo:RAIZ=nodo,
nodo=nodo->izquierdo.
Si el valor del nodo raz es menor que el
elemento que buscamos, continuaremos la
bsqueda en el rbol derecho: Padre=nodo,
nodo=nodo->derecho.
Si nodo no es NULL, el elemento est en el
rbol, por lo tanto salimos.
Si RAIZ es NULL, el rbol estaba vaco, por lo
tanto, el nuevo rbol slo contendr el nuevo
elemento, que ser la raz del rbol.
Si el elemento es menor que la RAIZ, entonces
insertamos el nuevo elemento como un nuevo
rbol izquierdo de RAIZ.
Si el elemento es mayor que la RAIZ, entonces
insertamos el nuevo elemento como un nuevo
rbol derecho de la RAIZ.

Ejemplo de ejecucin

*/////*arbol creado*//////*
recorrido PreOrden
Hola
esto
es
un
rbol
*/////* recorrido InOrden
es
arbol
un
esto
Hola
*/////recorrido PosOrden*/////
arbol
un
es
esto
Hola
*/////buscando en el rbol el nodo esto*/////
comprobacion exitosa se encontro el Nodo:esto
*/////*insertando el nodo : exito*/////*
*/////*recorrido PreOrden*/////*
Hola
esto
es
un
arbol
exito

Borrado en un rbol
Pueden darse tres casos, una vez encontrado el nodo a borrar:
1) El nodo no tiene descendientes. Simplemente se borra.

2) El nodo tiene al menos un descendiente por una sola


rama. Se borra dicho nodo, y su primer descendiente se asigna como hijo del
padre del nodo borrado.

3) El nodo tiene al menos un descendiente por cada rama.


Al borrar dicho nodo es necesario
mantener la coherencia de los
enlaces, adems de seguir
manteniendo la estructura como
un rbol binario de bsqueda. La
solucin consiste en sustituir la
informacin del nodo que se borra
por el de una de las hojas, y borrar
a continuacin dicha hoja
void borrar(tarbol **a, int elem)
{
void sustituir(tarbol **a, tarbol **aux);
tarbol *aux;
if (*a == NULL) /* no existe la clave (paso
inductivo)*/
return;
if ((*a)->clave < elem) borrar(&(*a)->der,
elem);
else if ((*a)->clave > elem) borrar(&(*a)>izq, elem);
else if ((*a)->clave == elem) {
aux = *a;
if ((*a)->izq == NULL) *a = (*a)->der;
else if ((*a)->der == NULL) *a = (*a)>izq;
else sustituir(&(*a)->izq, &aux); /* se
sustituye por
la mayor de las menores */

free(aux);//liberamos la memoria
que usamos con el auxiliar
}
}

Ejemplo de ejecucin

*/////*arbol creado*//////*
recorrido PreOrden
Hola
esto
es
un
rbol
*/////* recorrido InOrden
es
arbol
un
esto
Hola
*/////recorrido PosOrden*/////
arbol
un
es
esto
Hola
*/////buscando en el rbol el nodo esto*/////
comprobacion exitosa se encontro el Nodo:esto
*/////*insertando el nodo : exito*/////*
*/////*recorrido PreOrden*/////*
Hola
esto
es
un
arbol
xito
*/////*eliminando el nodo: es */////*
*/////*recorrido PreOrden*/////*
Hola
esto
un
arbol
xito

Los arboles binarios son estructuras que no sirven para manejar de forma muy eficiente , la verdad es que me
han gustado ms en cuanto a listas doblemente ligadas u otro tipo de estructuras ya que son muy eficientes en
la hora de buscar informacin, eliminar e insertar nuevos nodos cosas que no ocurre en otras estructuras ,el
nico inconveniente que le veo es que a la hora de crear el rbol no tenemos muchas opciones en cuanto a l
orden de introducir la informacin fuera de eso me parecen bastante eficientes

También podría gustarte