You are on page 1of 9

En esta ocasin trataremos una estructura muy importante, que tiene mucha utilidad en programacin, nos referimos a los

arboles binarios, ya que cada nodo del rbol no tendr ms de dos descendientes directos. 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. Terminologa: La que por lo regular se utiliza para el manejo de arboles es la siguiente: 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 INTERIOR. Es un nodo que no es raz ni terminal. GRADO. Es el nmero de descendientes directos de un determinado nodo. GRADO DEL ARBOL 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. Arboles binarios y Representacin grafica. Un rbol puede representarse grficamente de muchas formas. Algunas de ellas son por medio de: 1.- Conjuntos anidados.-

2.- Parntesis anidados.(1(2(4(9,10,11),5),3(6(12),7,8))) 3.- Indentacin.4.- Grfos.La forma ms comn de representar a los rboles es por medio de un grafo con la raz hacia arriba.

Representacin del A. B. en memoria: Hay dos formas tradicionales de representar un rbol binario en memoria: * Por medio de datos tipo punteros tambin conocidos como variables dinmicas o listas. * Por medio de arreglos. Sin embargo la ms utilizada es la primera, puesto que es la ms natural para tratar este tipo de estructuras. Los nodos del rbol binario sern representados como registros que contendrn como mnimo tres campos. En un campo se almacenar la informacin del nodo. Los dos restantes se utilizarn para apuntar al subarbol izquierdo y derecho del subarbol en cuestin. Cada nodo se representa grficamente de la siguiente manera: [Dato][Derecha] El algoritmo de creacin de un rbol binario es el siguiente: Procedimiento crear(q:nodo) inicio mensaje("Rama izquierda?") lee(respuesta) si respuesta = "si" entonces new(p) q(li) <-- nil crear(p) en caso contrario q(li) <-- nil mensaje("Rama derecha?") lee(respuesta)

si respuesta="si" entonces new(p) q(ld)<--p crear(p) en caso contrario q(ld) <--nil fin INICIO new(p) raiz<--p crear(p) FIN Como hemos visto, si el rbol binario que se desea representar cumpla las condiciones de rbol lleno o rbol completo, es posible encontrar una buena representacin secuencial del mismo. En esos casos, los nodos pueden ser almacenados en un array unidimensional, A, de manera que el nodo numerado como i se almacena en A. Esto permite localizar fcilmente las posiciones de los nodos padre, hizo izquierdo e hijo derecho de cualquier nodo i en un rbol binario arbitrario que cumpla tales condiciones. * Lema 3: si un rbol binario completo con n nodos se representa secuencialmente, se cumple que para cualquier nodo con ndice i, entre 1 y n, se tiene que: 1.- El padre del nodo i estar localizado en la posicin si i <> 1. Si i=1, se trata del nodo raz y no tiene padre. 2.- El hijo izquierdo del nodo estar localizado en la posicin [2i] si 2i <= n. Si 2i>n, el nodo no tiene hijo izquierdo. 3.- El hijo derecho del nodo estar localizado en la posicin [2i+1] si 2i+1 <= n. Si (2i+1) > n, el nodo no tiene hijo derecho. Evidentemente, la representacin puramente secuencial de un rbol se podra extender inmediatamente a cualquier rbol binario, pero esto implicara, en la mayora de los casos, desaprovechar gran cantidad del espacio reservado en memoria para el array. As, aunque para rboles binarios completos la representacin es ideal y no se desaprovecha espacio, en el peor de los casos para un rbol lineal (una lista) de profundidad k, se necesitara espacio para representar (2^k) - 1 nodos, y slo k de esas posiciones estaran realmente ocupadas. Se podra simular una estructura de enlaces, como la utilizada para las listas, mediante un array. En ese caso, los campos de enlace de unos nodos con otros no seran ms que ndices dentro del rango vlido definido para el array. La estructura de esa representacin enlazada pero ubicada secuencialmente en la memoria

correspondera al siguiente esquema para cada nodo: Estructura de un nodo. [Hijo izquierdo][Hijo derecho] donde el campo informacion guarda toda la informacin asociada con el nodo y los campos hijo izquierdo e hijo derecho guardan la posicin dentro del array donde se almacenan los respectivos hijos del nodo. Los problemas de esta representacin estn asociados con la manipulacin de la misma. En el caso de la insercin de nuevos nodos, el nico problema que puede aparecer es que se supere el espacio reservado para el array, en cuyo caso no se podrn insertar ms nodos. Sin embargo, la operacin de borrado implica mayores problemas de manipulacin. Al poder borrar cualquier nodo del rbol, se van a dejar "huecos" en la estructura secuencial del array, esto se podra solucionar, como siempre, mediante el desplazamiento de elementos dentro del vector. Sin embargo, si de por s esa operacin no resulta recomendable, en este caso mucho menos, ya que implica a su vez modificar los enlaces que hayan podido variar con el desplazamiento. La mejor solucin, de nuevo, para evitar los problemas asociados con la manipulacin de arrays, es la representacin de los rboles binarios mediante estructuras dinmicas "puras", en el sentido de la creacin en tiempo de ejecucin de los nodos que sean necesarios (no ms) y la utilizacin de punteros para enlazar estos nodos. La estructura de cada nodo en esta representacin coincide con la estructura de tres campos vista anteriormente. La nica diferencia reside en la naturaleza de los campos de enlace, en este caso se trata de punteros y no de ndices de un array. La implementacin en Pascal, sera: Type Valor = ??; arbol = ^Nodo; Nodo = record Info: Valor; Izq, Der: arbol; end; Var raiz: arbol; Se puede comprobar como la representacin en memoria de la estructura, en cuanto a definicin de tipos de datos, coincide exactamente con la de, por ejemplo, una lista doblemente ligada, sin que ello implique que se est hablando de la misma estructura de datos. De nuevo hay que dejar muy claro que es la interpretacin que hacemos de la representacin en memoria la que define una estructura de datos, no la

representacin en s misma. La representacin enlazada tiene como principal desventaja que no resulta inmediato la determinacin del padre de un nodo. Es necesario buscar el camino de acceso al nodo dentro del rbol para poder obtener esa informacin. Sin embargo, en la mayora de las aplicaciones es la representacin ms adecuada. En el caso en que la determinacin del padre de un nodo sea una operacin importante y frecuente en una aplicacin concreta, se puede modificar ligeramente la estructura de cada nodo aadiendo un cuarto campo, tambin de tipo enlace, que guarde la posicin del padre de cada nodo. RECORRIDO DE UN A.B. (en orden, preorden y postorden) Hay tres manera de recorrer un rbol : en inorden, preorden y postorden. Cada una de ellas tiene una secuencia distinta para analizar el rbol como se puede ver a continuacin: INORDEN Recorrer el subarbol izquierdo en inorden. Examinar la raz. Recorrer el subarbol derecho en inorden. PREORDEN Examinar la raz. Recorrer el subarbol izquierdo en preorden. recorrer el subarbol derecho en preorden. POSTORDEN Recorrer el subarbol izquierdo en postorden. Recorrer el subarbol derecho en postorden. Examinar la raz. ARBOLES ENHEBRADOS. NODO CABECERA Existe un tipo especial de rbol binario llamado enhebrado, el cual contiene hebras que pueden estar a la derecha o a la izquierda. * ARBOL ENHEBRADO A LA DERECHA. Este tipo de rbol tiene un apuntador a la derecha que apunta a un nodo antecesor. * ARBOL ENHEBRADO A LA IZQUIERDA. Estos arboles tienen un apuntador a la izquierda que apunta al nodo antecesor en orden.

En un rbol binario hay ms punteros null que punteros a nodos. En un rbol binario de n nodos hay 2n punteros, de los cuales n+1 son null. Se puede utilizar estos punteros para conseguir ciertas ventajas. Para diferenciarlos de los punteros no null le llamaremos hebras. Existen varias formas de enhebrado. Veremos el inorden. La hebras se construyen de la siguiente forma: 1.- Un 0 en un enlace derecho de un nodo p se reemplaza por por un puntero al nodo que se visitara despus de p en un recorrido en inorden (sucesor inorden). 2.- Un 0 en un enlace izquierdo de un nodo p se reemplaza por por un puntero al nodo que se visitara antes de p en un recorrido en inorden (predecesor inorden). 3.- Utilizaremos un nodo de cabecera. Ser predecesor del primer nodo y el sucesor del ltimo nodo. Para encontrar el sucesor, si su enlace derecho es una hebra, es inmediato, si no lo es, bastar recorrer, a partir de la posicin que seala dicho enlace, todos los nodos a su izquierda hasta encontrar la primera hebra. Para encontrar el predecesor, si su enlace izquierdo es una hebra, es inmediato, si no lo es, bastar recorrer, a partir de la posicin que seala dicho enlace, todos los nodos a su derecha hasta encontrar la primera hebra. OPERACIONES A.B. Las operaciones comunes en rboles son: * * * * * * * Enumerar todos los elementos. Buscar un elemento. Dado un nodo, listar los hijos (si los hay). Borrar un elemento. Eliminar un subrbol (llamado podar). Aadir un subrbol (llamado injertar). Encontrar la raiz de cualquier nodo.

La primera operacin a considerar sobre rboles binarios ser su generacin. En este caso, no vamos a entrar a considerar todos los casos que pueden aparecer al insertar un nuevo nodo en un rbol, la problemtica puede ser amplia y el proceso de generacin de un rbol depender de las reglas impuestas por una aplicacin particular. Vamos a ver, sin embargo, algn ejemplo concreto que permita ilustrar esta operacin. Al manipular la estructura rbol, la situacin ms habitual es que el problema imponga una serie de reglas para la construccin del rbol en funcin de los datos de entrada. Estos datos, en principio, sern desconocidos antes de la ejecucin del programa. El procedimiento de generacin del rbol deber, por tanto, reproducir de la manera ms eficiente posible esas reglas de generacin.

El borrado de nodos es otra operacin habitual de manipulacin de rboles binarios. Hay que tener en cuenta que esta operacin debe mantener la estructura del rbol y, por tanto, depender del orden que se haya establecido dentro del rbol. Esto hace que la eliminacin de nodos se pueda convertir en una operacin ms compleja y que no se pueda hablar de un algoritmo general de borrado, ms bien se podr hablar de algoritmos para borrar nodos para un determinado orden dentro del rbol. Si por ejemplo, un rbol ha sido generado teniendo en cuenta que sus nodos estn correctamente ordenados si se recorre el rbol en orden infijo, se debe considerar un algoritmo de borrado que no altere ese orden. La secuencia de orden a que da lugar el recorrido infijo se debe mantener al borrar cualquier nodo del rbol. ARBOLES EN MONTN Esta seccin consiste en transformar un bosque en un rbol binario. Entenderemos como bosque a un conjunto normalmente ordenado de dos o ms rboles generales. La serie de pasos que debemos seguir para lograr la conversin de un bosque en un rbol binario es la siguiente: 1. Enlazar horizontalmente las races de los distintos rboles generales. 2. Enlazar los hijos de cada nodo en forma horizontal (los hermanos). 3. Enlazar verticalmente el nodo padre con el hijo que se encuentra ms a la izquierda. Adems debe eliminarse el vnculo de ese padre con el resto de sus hijos. 4. Debe rotarse el diagrama resultante aproximadamente 45 grados hacia la izquierda y as se obtendr el rbol binario correspondiente. ARBOLES BINARIOS DE BUSQUEDA Un rbol de bsqueda binaria es una estructura apropiada para muchas de las aplicaciones que se han discutido anteriormente con listas. La ventaja especial de utilizar un arbol es que se facilita la bsqueda. Un rbol binario de bsqueda es aquel en el que el hijo de la izquierda (si existe) de cualquier nodo contiene un valor ms pequeo que el nodo padre, y el hijo de la derecha (si existe) contiene un valor ms grande que el nodo padre. Los rboles binarios de bsqueda son estructuras de datos que presentan un gran rendimiento cuando las funciones a realizar implican bsquedas, inserciones y eliminacin de nodos. De hecho, con un rbol de bsqueda, dichas operaciones se pueden realizar tanto a partir de un valor clave, como por un valor ordinal (es decir, encontrar un elemento con clave x, encontrar el sexto elemento ms pequeo, borrar el elemento con clave x, borrar el sexto elemento ms pequeo, insertar un elemento y determinar su ordinal dentro del rbol). Definicin: un rbol binario de bsqueda es un rbol binario, que puede estar vaco, y

que si es no vaco cumple las siguientes propiedades: (1) Todos los nodos estn identificados por una clave y no existen dos elementos con la misma clave. (2) Las claves de los nodos del subrbol izquierdo son menores que la clave del nodo raz. (3) Las claves de los nodos del subrbol derecho son mayores que la clave del nodo raz. (4) Los subrboles izquierdo y derecho son tambin rboles binarios de bsqueda. La primera propiedad resultara redundante, ya que de las propiedades (2), (3) y (4) se puede deducir que la clave de un nodo es nica. Sin embargo, la aparicin explcita de esta propiedad hace que la definicin sea ms clara. Veamos ahora cmo manipular este tipo especial de rboles binarios. Estudiaremos las operaciones de bsqueda, insercin y borrado. Bsqueda La definicin de rbol binario de bsqueda especifica un criterio en la estructuracin del rbol en funcin de las claves de los nodos. En este caso, existe un criterio de ordenacin de los nodos. Por lo tanto, ser bastante simple describir un mtodo eficiente de bsqueda que explote esta ordenacin. Suponer que se busca un elemento que posea la clave x. La bsqueda comenzar por el nodo raz del rbol. La clave de ese nodo informar por dnde debe continuar la bsqueda, ya no es necesario recorrer exhaustivamente todos los nodos del rbol. Si la clave del nodo es igual a x, la bsqueda finaliza con xito. Si la clave es menor que x, se sabe que si existe un nodo en el rbol que posea como clave el valor x deber estar en el subrbol derecho, por lo tanto la bsqueda deber continuar por esa parte del rbol. Si, por el contrario, la clave del nodo es mayor que x, entonces la bsqueda deber continuar por el subrbol izquierdo. El proceso continuar hasta que se encuentre un nodo con clave igual a x o un subrbol vaco, en cuyo caso se puede asegurar que no existe ningn nodo con clave x en el rbol. Este mtodo de bsqueda sugiere seguir un esquema recursivo. Suponiendo que la clave que identifica cada nodo es un campo contenido en la informacin general del nodo, el algoritmo de bsqueda quedara como sigue: Algoritmo Buscar (recursivo) Entradas p: arbol x: Valor (valor a buscar) Variable

aux: ABB (arbol binario de busqueda) Inicio si (p = NULO) entonces devolver(NULO) sino si (x = p^.info.clave) entonces devolver(p) sino si (x < p^.info.clave) entonces devolver(Buscar(x, p^.Izq)) sino devolver(Buscar(x, p^.Der)) fin_sino fin_sino Fin LONGITUD DE CAMINO Un camino en un rbol es una lista de vrtices diferentes en los que vrtices sucesivos estn conectados por arcos en el rbol. Una propiedad que define a los rboles es que existe exactamente un camino entre la raz y cada uno de los otros nodos en el rbol. La longitud de un camino es el nmero de nodos del camino menos uno. Por tanto, hay un camino de longitud cero de cualquier nodo a si mismo. Longitud de un camino: es el nmero de arcos que componen el camino. Podemos concluir que este tipo de estructura es una de las mas utilizadas pero que su implementacin es un poco mas complicada que las pilas o colas. Como podemos observar los arboles son una herramienta muy poderosa y de gran utilidad, su complejidad de uso y sus deficiencias dependen del lenguaje de programacin en el que se estn utilizando.

You might also like