You are on page 1of 11

INDICE

El xito se alcanza con perseverancia

Pgina 1

INTRODUCCION
En ciencias de la computacin, dentro de lo que son los arboles binarios estn los de bsquedas que se los emplea ms que todo para buscar informacin de forma rpida. Ests estructuras de datos son aquellas en la cual cada nodo siempre tiene un hijo izquierdo y un hijo derecho. No pueden tener ms de dos hijos (de ah el nombre "binario"). Si algn hijo tiene como referencia a null, es decir que no almacena ningn dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno. Usos comunes de los rboles binarios son los rboles binarios de bsqueda, los montculos binarios y Codificacin de Huffman.

OBJETIVO GENERAL
Conocer e identificar cules son los arboles binarios a travs de sus caractersticas, asi como tambin conocer cules son los tipos de arboles de este tipo.

OBJETIVO ESPECFICO
Aprender a trabajar con estos rboles, ms que todo en el mbito de recorridos; para asi poder ingeniar la forma de aplicacin sobre todo en los pequeos o grandes programas que realicemos.

El xito se alcanza con perseverancia

Pgina 2

ARBOLES BINARIOS
Se define un rbol binario como un conjunto finito de elementos (nodos) que bien est vaco o est formado por una raz con dos rboles binarios disjuntos, es decir, dos descendientes directos llamados subrbol izquierdo y subrbol derecho. Los rboles binarios (tambin llamados de grado 2 ) tienen una especial importancia. Las aplicaciones de los arboles binarios son muy variadas ya que se les puede utilizar para representar una estructura en la cual es posible tomar decisiones con dos opciones en distintos puntos. rbol binario de bsqueda. Los rboles binarios se utilizan frecuentemente para representar conjuntos de datos cuyos elementos se identifican por una clave nica. Si el rbol est organizado de tal manera que la clave de cada nodo es mayor que todas las claves su subrbol izquierdo, y menor que todas las claves del subrbol derecho se dice que este rbol es un rbol binario de bsqueda.

Operaciones bsicas Una tarea muy comn a realizar con un rbol es ejecutar una determinada operacin con cada uno de los elementos del rbol. Esta operacin se considera entonces como un parmetro de una tarea ms general que es la visita de todos los nodos o, como se denomina usualmente, del recorrido del rbol. Si se considera la tarea como un proceso secuencial, entonces los nodos individuales se visitan en un orden especfico, y pueden considerarse como organizados segn una estructura lineal. De hecho, se simplifica considerablemente la descripcin de muchos algoritmos si puede hablarse del proceso del siguiente elemento en el rbol, segn un cierto orden subyacente.

El xito se alcanza con perseverancia

Pgina 3

Clasificacin de Arboles Binarios Existen cuatro tipos de rbol binario:


y y y y

rbol Binario Distinto. rbol Binario Similares. rbol Binario Equivalentes. rbol Binario Completos.

A continuacin se har una breve descripcin de los diferentes tipos de rbol binario as como un ejemplo de cada uno de ellos. rbol Binario Distinto Se dice que dos rboles binarios son distintos cuando sus estructuras son diferentes.

rbol Binario Similar Dos rboles binarios son similares cuando sus estructuras son idnticas, pero la informacin que contienen sus nodos es diferente.

El xito se alcanza con perseverancia

Pgina 4

rbol Binario Equivalente Son aquellos arboles que son similares y que adems los nodos contienen la misma informacin.

rbol Binario Completo Son aquellos arboles en los que todos sus nodos excepto los del ltimo nivel, tiene dos hijos; el subrbol izquierdo y el subrbol derecho.

El xito se alcanza con perseverancia

Pgina 5

RECORRIDO DE UN ARBOL BINARIO


Hay dos formas bsicas de recorrer un rbol: El recorrido en amplitud y el recorrido en profundidad.

Recorrido en amplitud Es aquel recorrido que recorre el rbol por niveles, en el rbol de arriba sera: 12 - 8,17 - 5,9,15 Recorrido en profundidad Recorre el rbol por subrboles. Hay tres Preorden, orden central y postorden. Hay tres formas: en inorden, preorden y postorden. Cada una de ellas tiene una secuencia distinta para analizar el rbol como se puede ver a continuacin: Ejemplo de rbol:

El xito se alcanza con perseverancia

Pgina 6

1. Inorden
y y y

Recorrer el subrbol izquierdo en inorden. Examinar la raz. Recorrer el subrbol derecho en inorden.

Si seguimos el rbol del ejemplo en in-orden, y el proceso de los datos es sencillamente mostrarlos por pantalla, obtendremos algo as: KEBFALGMCHDINJO 2. Preorden
y y y

Examinar la raz. Recorrer el subrbol izquierdo en preorden. recorrer el subrbol derecho en preorden.

Si seguimos el rbol del ejemplo en pre-orden, y el proceso de los datos es sencillamente mostrarlos por pantalla, obtendremos algo as: ABEKFCGLMDHIJNO 3. Postorden
y y y

Recorrer el subrbol izquierdo en postorden. Recorrer el subrbol derecho en postorden. Examinar la raz.

Si seguimos el rbol del ejemplo en post-orden, y el proceso de los datos es sencillamente mostrarlos por pantalla, obtendremos algo as: KEFBLMGCHINOJDA

El xito se alcanza con perseverancia

Pgina 7

CDIGO
//El programa genera un arbol binario, captura caracteres y los introduce en el arbol, despues muestra los recorridos en preorden, inorden y postorden. Maneja memoria dinamica!!! //PROGRAMA QUE CAPTURA UNA CADENA DE CARACTERES DE MAXIMO 200 ELEMENTOS Y //CREA UN ARBOL DE BUSQUEDA CON LOS CARACTERES DE LA CADENA Y REALIZA RECORRIDOS // EN PREORDEN,ENTREORDEN Y POSTORDEN. #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<string.h> /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ struct nodoarbol{ //ESTRUCTURA DEL ARBOL struct nodoarbol *izqnodo; int info; struct nodoarbol *dernodo; }; typedef struct nodoarbol NODO; //DEFINICION DE TIPO NODO typedef NODO *ARBOL; //DECLARACION DE VARIABLE PUNTERO A NODO /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ void insertanodonuevo(ARBOL *,int); //DECLARACION DE FUNCIONES void inorden(ARBOL); void preorden(ARBOL); void postorden(ARBOL); void treefree(ARBOL); /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ /*-----------------------<FUNCION PRINCIPAL>--------------------------------*/

main(){ int i; //CONTADOR char newnod,chain[200],elementos; //DECLARACION DE CADENA,BANDERA Y VARIABLE QUE CONTIENE EL NUEVO VALOR A INSERTAR EN EL ARBOL clrscr(); ARBOL raiz=NULL; //DECLARACION DE VARIABLE DE TIPO ARBOL printf("\n\n\tIntroduzca una cadena de caracteres (max. 200 elementos):\n"); gets(chain); elementos=strlen(chain); //CHECA EL TAMAO DE LA CADENA Y ESTABLECE EL NUMERO DE NODOS DEL ARBOL for(i=1;i<=elementos;i++) { newnod=chain[i-1]; insertanodonuevo(&raiz,newnod);
El xito se alcanza con perseverancia

Pgina 8

} printf("\n\n preorden \t"); preorden(raiz); //LLAMADO A FUNCION DE RECORRIDO EN PREORDEN printf("\n\n inorden \t"); inorden(raiz); //LLAMADO A FUNCION DE RECORRIDO EN INORDEN printf("\n\n postorden \t"); postorden(raiz); //LLAMADO A FUNCION DE RECORRIDO EN POSTORDEN getch(); treefree(raiz); //LIBERACION DE MEMORIA DEL ARBOL. raiz=NULL; //ASIGNACION DE UN VALOR NULO A LA RAIZ. return 0; } /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ /*-CREA UN NUEVO NODO Y COLOCA LOS VALORES DEL NUEVO ELEMENTO EN LA POSICION CORRESPONDIENTE */ void insertanodonuevo(ARBOL *rarbol,int nuevo){ if(*rarbol==NULL){ //CREACION DE UN NUEVO NODO *rarbol=(NODO *)malloc(sizeof(NODO)); if(*rarbol!=NULL){ //ASIGNACION DE VALORES NUEVOS EN EL NODO NUEVO (*rarbol)->info=nuevo; (*rarbol)->izqnodo =NULL; (*rarbol)->dernodo=NULL; } else{printf("\n---- Memoria No Disponible !!!!\n");} } else if(nuevo<(*rarbol)->info) //checa si el elemento nuevo es mayor que el elemento padre insertanodonuevo(&((*rarbol)->izqnodo),nuevo); //coloca el elemento a la izquierda del padre o raiz else if(nuevo>(*rarbol)->info) //checa si el elemento nuevo es menor que el elemento padre insertanodonuevo(&((*rarbol)->dernodo),nuevo); //coloca el elemento a la derecha del padre o raiz } /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ //FUNCION ITERATIVA LA CUAL RECORRE EL ARBOL IMPRIMIENDO SIEMPRE EL VALOR //QUE CONTIENE LA RAIZ,DESPUES LA RAMA IZQUIERDA,LUEGO LA RAMA DERECHA,SIEMPRE //Y CUANDO LA RAIZ SEA DIFERENTE DE UN VALOR NULO, SI ES NULO SALTA A LA SIGUIENTE INSTRUCCION. void preorden(ARBOL rarbol){ if(rarbol!=NULL){ printf(" %c ",rarbol->info); preorden(rarbol->izqnodo);
El xito se alcanza con perseverancia

Pgina 9

preorden(rarbol->dernodo); } } /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ //FUNCION ITERATIVA LA CUAL RECORRE EL ARBOL BUSCANDO EL NODO MAS IZQUIERDO //QUE CONTIENE EL ARBOL O SEA HASTA QUE LA RAMA DEL ULTIMO NODO SEA NULO,LUEGO LA IMPRIME,DESPUES //DESPUES LA RAIZ DEL SUB-ARBOL,Y LUEGO EL NODO DE LA DERECHA. void inorden(ARBOL rarbol){ if(rarbol!=NULL){ inorden(rarbol->izqnodo); printf(" %c ",rarbol->info); inorden(rarbol->dernodo); } } /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ //FUNCION ITERATIVA LA CUAL RECORRE EL ARBOL BUSCANDO EL NODO QUE ESTA MAS A LA IZQUIERDA //LUEGO EL NODO DE LA DERECHA Y LUEGO LA RAIZ DE ESE SUB-ARBOL void postorden(ARBOL rarbol){ if(rarbol!=NULL){ postorden(rarbol->izqnodo); postorden(rarbol->dernodo); printf(" %c ",rarbol->info); } } /**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ //FUNCION ITERATIVA IDENTICA AL RECORRIDO EN POSTORDEN LA UNICA DIFERENCIA //ES QUE EN VEZ DE IMPRIMIR EN PANTALLA EL VALOR DE UN NODO ESTE ES //ELIMINADO DEL ARBOL LIBERANDO LA MEMORIA CON LA FUNCION free(), ELEGI ESTA //FORMA YA QUE SE ELIMINA PRIMERO LOS NODOS HIJO DE EL SUB-ARBOL Y LUEGO LA RAIZ //YA QUE SI SE ELIMINA LA RAIZ PRIMERO, LOS DATOS DE LOS HIJOS SE DESCONECTAN //DEL ARBOL PERO LA MEMORIA QUE OCUPABAN SIGUE SIENDO UTILIZADA Y DE ESTA FORMA //SE ELIMINA EL ARBOL DE ABAJO HACIA ARRIBA (O SEA DE LOS HIJOS A LA RAIZ). void treefree(ARBOL rarbol){ if(rarbol!=NULL){ treefree(rarbol->izqnodo); treefree(rarbol->dernodo); free(rarbol); } } /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
El xito se alcanza con perseverancia

Pgina 10

TERMINOLOGA
La terminologa que por lo regular se utiliza para el manejo de arboles es la siguiente:
y

Hijo: X es hijo de Y, s y solo s el nodo X es apuntado por Y. Tambin se dice que X es descendiente directo de Y. Padre: X es padre de Y s y solo s el nodo X apunta a Y. Tambin se dice que X es antecesor de Y. Hermano: Dos nodos sern hermanos si son descendientes directos de un mismo nodo. Hoja: Se le llama hoja o terminal a aquellos nodos que no tienen ramificaciones (hijos). Nodo anterior: Es un nodo que no es raz ni terminal. Grado: Es el nmero de descendientes directos de un determinado nodo. Grado de un rbol: Es el mximo grado de todos los nodos del rbol. Nivel: Es el nmero de arcos que deben ser recorridos para llegar a un determinado nodo. Por definicin la raz tiene nivel 1. Altura: Es el mximo nmero de niveles de todos los nodos del rbol. Peso: Es el nmero de nodos del rbol sin contar la raz. Longitud de camino: Es el nmero de arcos que deben ser recorridos para llegar desde la raz al nodo X. Por definicin la raz tiene longitud de camino 1, y sus descendientes directos longitud de camino 2 y as sucesivamente.

y y y y

y y y

El xito se alcanza con perseverancia

Pgina 11

You might also like