ESTRUCTURAS DE DATOS
SEMANA 8
Árboles binarios
Todos los derechos de autor son de la exclusiva propiedad de IACC o de los otorgantes de sus licencias. No está permitido copiar, reproducir, reeditar, descargar, publicar, emitir, difundir, poner a disposición del público ni ESTE LAdeSEMANA 8 utilizarDOCUMENTO los contenidos paraCONTIENE fines comerciales ninguna clase.
1
ESTE DOCUMENTO CONTIENE LA SEMANA 8
2
ÍNDICE OBJETIVO ESPECÍFICO............................................................................................................................... 4 INTRODUCCIÓN ...................................................................................................................................... 4 1.
2.
3.
CONCEPTO DE ÁRBOL BINARIO ................................................................................................... 4 1.1.
ESTRUCTURA DE UN NODO EN UN ÁRBOL BINARIO........................................................... 5
1.2.
REPRESENTACIÓN DE ÁRBOLES BINARIOS .......................................................................... 6
1.3.
ÁRBOLES BINARIOS DE BÚSQUEDA ..................................................................................... 6
OPERACIONES CON ÁRBOLES BINARIOS DE BÚSQUEDA ............................................................ 7 2.1.
BÚSQUEDA .......................................................................................................................... 7
2.2.
INSERTAR ............................................................................................................................. 8
2.3.
ELIMINAR ........................................................................................................................... 11
2.4.
RECORRIDO ....................................................................................................................... 12
APLICACIONES DE ÁRBOLES BINARIOS ...................................................................................... 14 3.1.
ÁRBOL AVL ......................................................................................................................... 14
COMENTARIO FINAL.............................................................................................................................. 15 REFERENCIAS ..................................................................................................................................... 16
ESTE DOCUMENTO CONTIENE LA SEMANA 8
3
ÁRBOLES BINARIOS
OBJETIVO ESPECÍFICO
Analizar la utilización y las operaciones asociadas a la estructura de datos árboles binarios.
INTRODUCCIÓN Existen varios tipos de árboles, esta semana se estudiarán los árboles de grado 2, es decir, aquellos cuyos nodos pueden tener como máximo dos descendientes. Se estudiarán las representaciones de los árboles binarios y los árboles binarios de búsqueda así como las operaciones y situaciones críticas que se pueden presentar al trabajar con los árboles binarios de búsqueda.
1. CONCEPTO DE ÁRBOL BINARIO En un árbol binario cada nodo se compone de tres partes: a) un puntero hacia el hijo izquierdo (hacia el 3 en la figura), b) la información que almacena (1 según la figura) y c) un puntero hacia el hijo derecho (hacia el 6 en la figura) (López, 2012).
Fuente: https://goo.gl/OdzbHg
ESTE DOCUMENTO CONTIENE LA SEMANA 8
4
Por su parte, Ricardo Ruiz (s. f.) define un árbol binario como: Un conjunto finito de elementos, el cual está vacío o dividido en tres subconjuntos separados:
El primer subconjunto contiene un elemento único llamado raíz del árbol. El segundo subconjunto es en sí mismo un árbol binario y se le conoce como subárbol izquierdo del árbol original. El tercer subconjunto es también un árbol binario y se le conoce como subárbol derecho del árbol original.
El subárbol izquierdo o derecho puede o no estar vacío y cada elemento de un árbol binario se conoce como nodo del árbol.
Para conocer más sobre este tema puede revisar el siguiente video: Árbol binario
1.1. ESTRUCTURA DE UN NODO EN UN ÁRBOL BINARIO Puntero al hijo izquierdo
Dato o información
Puntero al hijo derecho
Los punteros a los hijos del nodo son variables que hacen referencia a un dato por medio de su dirección de memoria, es decir, el puntero almacena como valor la dirección de memoria de un dato, por lo cual se dice que apunta a dicho dato (López, 2012).
Fuente: https://goo.gl/WdzQGt
ESTE DOCUMENTO CONTIENE LA SEMANA 8
5
Como un árbol binario es una estructura de datos dinámica, no requiere establecer su tamaño, ya que su demanda de memoria crece conforme se agregan nodos, pero se libera cuando son eliminados.
1.2. REPRESENTACIÓN DE ÁRBOLES BINARIOS Un árbol binario puede representarse utilizando punteros o referencias que definen la secuencia de nodos que contiene uno para el hijo izquierdo (nodo 6 en la figura) y otro para el hijo derecho (nodo 20 en la figura). Además, es necesario identificar el primer nodo lógico de árbol conocido como raíz, el cual carece de padre o antecesor (ver 15 en la figura) (López, 2012).
Fuente: https://goo.gl/lsTx0n
1.3. ÁRBOLES BINARIOS DE BÚSQUEDA Un árbol binario de búsqueda (ABB) es un caso particular de árbol binario que tiene como finalidad mejorar la eficiencia de búsqueda de un nodo y su característica principal es que todos los hijos izquierdos de un nodo son menores que él, mientras que sus hijos derechos son mayores (López, 2012). Por ejemplo, en el siguiente árbol binario se puede observar que todos los nodos que parten del nodo izquierdo de 20 son menores que él, es decir, nodos 14, 8, 1, 18, 16 y 19; y todos los hijos derechos son mayores, o sea, nodos 44, 22 y 50.
Fuente: https://goo.gl/rygwlS
ESTE DOCUMENTO CONTIENE LA SEMANA 8
6
Formalmente se define un árbol binario de búsqueda de la siguiente manera: Para todo nodo T del árbol se debe cumplir que todos los valores almacenados en el subárbol izquierdo de T sean menores o iguales a la información guardada en el nodo T. De forma similar, todos los valores almacenados en el subárbol derecho de T deben ser mayores o iguales a la información guardada en el nodo T. Los valores a los que se hace referencia en la definición refieren al contenido del campo de información del nodo (Cairó y Guardati, 2006, p. 203).
2. OPERACIONES CON ÁRBOLES BINARIOS DE BÚSQUEDA El acomodo de nodos en un ABB depende de los enlaces controlados por el puntero hacia la raíz y los sucesivos punteros hacia los hijos de los nodos; por ello, cuando se insertan o eliminan nodos de un ABB se deben modificar los punteros para mantener la secuencia lógica correcta. Lo anterior significa que no necesariamente coincide el acomodo físico de los nodos con la secuencia lógica del recorrido del ABB, ya que los nodos se pueden insertar en cualquier orden; sin embargo, los punteros se encargan de mantenerlos enlazados lógicamente (López, 2012). A continuación se explicarán las operaciones básicas que se pueden realizar con el ABB:
2.1. BÚSQUEDA Esta operación consiste en recorrer el ABB (partiendo de la raíz) para localizar un nodo en particular y consultar su información. Debido al ordenamiento lógico de los nodos, no siempre es necesario recorrerlo completo para localizar el nodo deseado. De hecho, el objetivo principal de un ABB es reducir a la mitad la cantidad de operaciones para encontrar un nodo, pues al iniciar las comparaciones en el nodo raíz y detectar si el nodo buscado es mayor o menor que él (para considerar si se analiza el subárbol del lado izquierdo o del lado derecho) automáticamente se descarta el subárbol restante (López, 2012).
ESTE DOCUMENTO CONTIENE LA SEMANA 8
7
Ejemplo: Considere el siguiente árbol binario de búsqueda: Si se quiere buscar el nodo 9, se inicia el proceso en la raíz (nodo 5) y se detecta que el 9 es mayor que él, ante lo cual se procede a buscar en el subárbol derecho, moviéndose hacia su hijo derecho desde el nodo 8:
Fuente: López (2012, p. 330).
Con lo anterior, automáticamente se descartan todos los nodos ubicados en el subárbol izquierdo (puesto que son menores). El mismo proceso se ejecuta de manera repetida con los hijos del subárbol correspondiente, al hacerlo, cada etapa del proceso de búsqueda reduce a la mitad la cantidad de nodos a considerar (López, 2012). Si se implementa una búsqueda tradicional de un nodo en un conjunto que contiene n elementos, al hacer la primera comparación se tienen n-1 nodos pendientes de analizar; sin embargo, al aplicar una búsqueda en ABB con n nodos, después de revisar la raíz, el proceso se reduce a analizar n/2 nodos; con lo que se mejora la eficiencia del proceso (López, 2012, p. 331).
2.2. INSERTAR Cuando se inserta un nuevo nodo a un ABB se debe crear el espacio de memoria para almacenarlo y acomodarlo mediante los punteros correspondientes. Cuando se inserta un nodo, habrá de realizarse un recorrido para visitar cada nodo (NodoActual) y compararlo con el nuevo nodo que se desea insertar (NuevoNodo), manteniendo el antecesor del nodo actual (padre). El recorrido se inicia haciendo que el NodoActual sea la raíz y su padre nulo. El proceso consiste en cambiar sucesivamente de padre y aplicar en forma repetida el siguiente conjunto de pasos: a) Si el puntero raíz es nulo, entonces el NuevoNodo se convierte en la raíz y termina el proceso. b) Si el NuevoNodo es igual al NodoActual, entonces termina el proceso, porque se intenta insertar un nodo duplicado y se descarta, ya que solo se permiten nodos únicos.
ESTE DOCUMENTO CONTIENE LA SEMANA 8
8
c) Si el NodoActual es nulo, entonces su padre apuntará al NuevoNodo. Si el NuevoNodo es menor que el padre, entonces el NuevoNodo será el nuevo hijo izquierdo del padre, si no, entonces el NuevoNodo será el nuevo hijo derecho del padre. d) Si el NuevoNodo es menor que el NodoActual, entonces el NuevoNodo debe estar en el subárbol izquierdo del NodoActual. El padre se convierte en el NodoActual y el NodoActual se convierte en el hijo izquierdo del NodoActual y se regresa al paso b. e) Si el NuevoNodo es mayor que el NodoActual, entonces el NuevoNodo debe estar en el subárbol derecho del NodoActual. El padre se convierte en el NodoActual y el NodoActual se convierte en el hijo derecho del NodoActual y se regresa al paso b.
INSERCIÓN EN UN ABB VACÍO
La inserción en un ABB vacío sucede cuando se inserta el primer nodo en un ABB (paso a). Ejemplo: suponga que tiene un ABB vacío (raíz → nulo) y se inserta el nodo con el número 60. En este caso, se crea el nodo y se convierte en el elemento apuntado por la raíz. El nuevo nodo no tiene sucesores, por lo que sus punteros a los hijos derecho e izquierdo se dirigen a nulo (López, 2012).
Inserción del primer nodo de un ABB
INSERCIÓN A LA IZQUIERDA
La inserción a la izquierda sucede cuando se inserta un nodo menor que el nodo actual, el cual provoca avanzar hacia la izquierda del ABB. Ejemplo: suponga que se inserta el nodo con el número 40 en un árbol. En este caso se crea el nodo y se convierte en el hijo izquierdo apuntado por el nodo 60. El nuevo nodo no tiene sucesores, por lo que sus apuntadores a los hijos derecho e izquierdo se dirigen a nulo. Cabe mencionar que este caso puede presentarse sucesivamente para cada uno de los nodos del ABB, es decir, no es exclusivo de la raíz (López, 2012).
ESTE DOCUMENTO CONTIENE LA SEMANA 8
9
INSERCIÓN A LA DERECHA
La inserción a la derecha sucede cuando se inserta un nodo mayor que el nodo actual, el cual provoca avanzar hacia derecha del ABB. Ejemplo: suponga que se inserta el nodo con el número 90 en un ABB. En este caso, se crea el nodo y se convierte en el hijo derecho apuntado por el nodo 60. El nuevo nodo no tiene sucesores, por lo que sus apuntadores a los hijos derecho e izquierdo se dirigen a nulo (López, 2012).
INSERCIÓN IZQUIERDA –DERECHA
La inserción izquierda-derecha sucede cuando se inserta un nodo mayor que el hijo izquierdo del nodo actual, el cual provoca avanzar hacia la derecha del subárbol izquierdo del nodo actual. Ejemplo: suponga que se inserta el nodo con el número 50 en un ABB. En este caso, el nuevo nodo es menor que 60 y mayor que 40, por lo que se crea el nodo y se convierte en el hijo derecho apuntado por el nodo 40. El nuevo nodo no tiene sucesores, por lo que sus apuntadores a los hijos derecho e izquierdo se dirigen a nulo. Cabe mencionar que tal caso puede presentarse sucesivamente para cada uno de los nodos del ABB, es decir, no es exclusivo para la raíz (López, 2012).
INSERCIÓN DERECHA –IZQUIERDA
La inserción derecha-izquierda sucede cuando se inserta un nodo menor que el hijo derecho del nodo actual, el cual provoca avanzar hacia la izquierda del subárbol derecho del nodo actual.
ESTE DOCUMENTO CONTIENE LA SEMANA 8
10
Ejemplo: suponga que se inserta el nodo con el número 70 en un ABB. En este caso, el nuevo nodo es mayor que 60 y mayor que 90, por lo que se crea el nodo y se convierte en el hijo izquierdo apuntado por el nodo 90. El nuevo nodo no tiene sucesores, por lo que sus apuntadores a los hijos derecho e izquierdo se dirigen a nulo (López, 2012).
2.3. ELIMINAR Esta operación borra un nodo de un ABB. Debido a que un ABB es dinámico, cuando se elimina un nodo se libera espacio de memoria y se ajustan los punteros correspondientes para mantener la secuencia lógica. El proceso de eliminar un nodo de un ABB es considerablemente más complicado que la inserción, debido a que al borrar un nodo con hijos requiere seleccionar otro nodo que lo reemplace y mantenga la característica principal (los hijos izquierdos son menores y los hijos derechos mayores que su padre). A continuación se presentan algunos ejemplos (López, 2012): Si se desea eliminar el nodo 59 del siguiente ABB:
Quedaría de esta manera:
Sin embargo hay que considerar lo siguiente (Lancheros, Benítez y Gualtero, s. f.):
Si el nodo a borrar no tiene hijos, simplemente se libera el espacio que ocupa. Si el nodo a borrar tiene un solo hijo, se añade como hijo de su padre, sustituyendo la posición ocupada por el nodo borrado.
ESTE DOCUMENTO CONTIENE LA SEMANA 8
11
Si el nodo a borrar tiene dos hijos se siguen los siguientes pasos: se busca el máximo de la rama izquierda o el mínimo de la rama derecha, o se sustituye el nodo a borrar por el nodo encontrado.
Para conocer más a fondo sobre la eliminación de nodos dentro de un árbol binario puede revisar el siguiente enlace: Eliminación de nodos dentro de un ABB
2.4. RECORRIDO Esta operación visita todos los nodos del ABB para mostrar su contenido.
RECORRIDO PREORDEN
Un recorrido en preorden consiste en visitar sucesivamente y desplegar el dato del nodo actual, luego su hijo izquierdo y después su hijo derecho (López, 2012).
ESTE DOCUMENTO CONTIENE LA SEMANA 8
12
Ejemplo: al recorrer el ABB en modo preorden, la salida sería: 60, 40, 30, 20, 35, 50, 45, 90, 70, 65, 75 y 95.
RECORRIDO INORDEN
Un recorrido en inorden consiste en recorrer sucesivamente primero el hijo izquierdo del nodo actual. Luego visitar y desplegar el dato del nodo actual y, por último, recorrer sucesivamente el hijo derecho (López, 2012). Ejemplo: de acuerdo al ABB anterior, al recorrer el árbol en modo inorden, la salida sería: 20, 30, 35, 40, 45, 50, 60, 65, 70, 75, 90 y 95.
RECORRIDO POSTORDEN
Un recorrido postorden consiste en recorrer sucesivamente primero el hijo izquierdo del nodo actual, luego recorrer sucesivamente el hijo derecho y, por último, visitar y desplegar el dato del nodo actual (López, 2012). Ejemplo: siguiendo el ejercicio anterior, al recorrer el ABB en modo postorden, la salida sería: 20, 35, 30, 45, 50, 40, 65, 75, 70, 95, 90, 60.
ESTE DOCUMENTO CONTIENE LA SEMANA 8
13
3. APLICACIONES DE ÁRBOLES BINARIOS Hay varias aplicaciones de árboles binarios en la vida cotidiana, entre los que se menciona el avance en cualquier torneo deportivo, donde solo hay un campeón, dos finalistas y cuatro semifinalistas, etc. (López, 2012). Resultados del campeonato mundial de ajedrez como árbol binario de búsqueda Cuartos de final
Semifinales
Final
Fuente: http://goo.gl/R0LTVi
3.1. ÁRBOL AVL Un árbol binario está equilibrado si, para cada uno de sus nodos, ocurre que las alturas de sus dos subárboles difieren como mucho en un nivel. Los árboles que cumplen esta condición son denominados a menudo árboles AVL (Lopez, García y Martín, s. f.). Ejemplo: en la figura de la izquierda se muestra un árbol que es AVL, mientras que en la figura de la derecha no lo es al no cumplirse la condición en el nodo k.
Fuente: https://goo.gl/cTEr8P
ESTE DOCUMENTO CONTIENE LA SEMANA 8
14
COMENTARIO FINAL La búsqueda en árboles binarios es un método simple, dinámico y eficiente considerado como uno de los fundamentales en informática. De esta manera abren las puertas al conocimiento de las estructuras de datos, pues ayudan a manejar un gran volumen de datos y dar gran aplicabilidad en la indexación de archivos, organización de bases de datos y búsqueda de información. Al brindar la utilidad de ordenar la información —separando el total en dos posibilidades (izquierda y derecha)— se reduce el conjunto de búsqueda a la mitad en cada paso con lo cual el proceso se hace más rápido y expedito, además de optimizar el almacenamiento de datos. Por tanto el conocimiento de árboles y árboles binarios proporciona el manejo de la información imprescindible a la hora de enfrentarse a los diferentes problemas que podrán surgir en el uso de las estructuras de datos y complementar su desarrollo en diversas actividades, entre ellas, la programación.
ESTE DOCUMENTO CONTIENE LA SEMANA 8
15
REFERENCIAS Cairó, O. y Guardati, S. (2006). Estructuras de datos. 3.a edición. México: McGraw-Hill. Lancheros, L.; Benítez, A. y Gualtero, A. (s. f.). Eliminación de nodos dentro de un árbol binario de búsqueda. Recuperado de: https://goo.gl/BFMw30 López, B. (2012). Estructuras de datos orientadas a objetos. 1. a edición. México: Alfaomega. Lopez, E.; García, A. y Martín, A. (s. f.). Árboles AVL. Universidad de Granada. Recuperado de: https://goo.gl/cTEr8P
PARA REFERENCIAR ESTE DOCUMENTO, CONSIDERE: IACC (2017). Árboles binarios. Estructuras de Datos. Semana 8.
ESTE DOCUMENTO CONTIENE LA SEMANA 8
16
ESTE DOCUMENTO CONTIENE LA SEMANA 8
17