Objetivos! Presentar el árbol como estructura de datos jerárquica! Estudiar diferentes variantes de árboles, tanto en su especificación como en su implementación Contenidos 3.1 Concepto, definiciones y terminología básica 3.2 Árbol n-ario 3.2.1 Especificación algebraica 3.2.2 Implementación 3.3 Árbol binario 3.3.1 Especificación algebraica 3.3.2 Implementación 3.4 Recorridos sobre árboles 3.5 Árboles binarios de búsqueda (ABB) 3.5.1 Especificación algebraica 3.5.2 Implementación Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 1 3.6 Árboles binarios equilibrados 3.7 Árboles B, B + y B * 3.8 Colas de prioridad y montículos Duración! 7 clases (10,5 h) Bibliografía! Estructuras de datos: especificación, diseño e implementación Autor: Xavier Franch Gutiérrez Editorial : Ediciones UPC, 1999 Págs. 219-303! Estructuras de datos. Algoritmos, abstracción y objetos Autor: Luis Joyanes Aguilar, Ignacio Zahonero Martínez Editorial: McGraw-Hill Págs. 311-416 Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 2
3.1 Concepto, definiciones y terminología básica! Los árboles son estructuras que organizan sus elementos, denominados nodos, formando jerarquías. De entre estos nodos existe uno especial denominado raíz! Existe una relación (de paternidad entre los nodos) que hace que la estructura sea jerárquica frente a la estructura lineal! El uso de los árboles está muy extendido en programación. Algunos ejemplos pueden ser:! estructurar los directorios y archivos en los sistemas operativos! representar la estructura de las fórmulas matemáticas! organizar la información en los SGBD! representar la estructura sintáctica de un programa fuente en los compiladores! representar sistemas de clasificación Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 3! La definición recursiva de árbol es: Un árbol n-ario (con n 1) es un conjunto no vacío de elementos o nodos del mismo tipo tal que:! un único nodo es un árbol, llamado raíz del árbol! el resto de los elementos se distribuyen en m (0 m n) subconjuntos disjuntos, denominados subárboles, cada uno de los cuales es a su vez un árbol n-ario! Un árbol con raíz x y subárboles A 1,, A m se representa de la siguiente forma: x A 1... A m Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 4
! Podemos clasificar los árboles atendiendo a diferentes criterios: " Cuando existe una relación de orden total en el conjunto de los subárboles de un árbol n-ario, el árbol se llama ordenado (será el que utilizaremos) " Si no existe limitación para el número de hijos que pueda tener un nodo, el árbol se denomina general. Por el contrario, si existe un número fijo n que limita el número de hijos de un nodo, el árbol se denomina n-ario " Cuando los nodos de una árbol contienen información (caso más habitual), el árbol se denomina etiquetado Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 5 Terminología Básica H A B C D E F G I J K L M Nodo: Cada posición dentro del árbol junto con la información asociada Si existe una arista (rama) dirigida del nodo n al nodo m, entonces n es el padre de m y m es un hijo de n Los hijos del mismo padre se denominan hermanos Todos los nodos de un árbol menos uno, denominado nodo raíz, tienen un único padre Una hoja de un árbol es un nodo que no tiene hijos. El resto de los nodos se denominan interiores o internos Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 6
Terminología Básica H A B C D E F G I J K L M Se denomina camino del nodo n 1 al nodo n k a la secuencia de nodos de un árbol n 1, n 2,, n k, de forma que n i es el padre de n i+1 (1 i k) La longitud de un camino es el número de nodos del camino menos 1. Por convenio, decimos que existe un camino de longitud 0 de un nodo a sí mismo Si existe un camino desde un nodo n 1 hasta un nodo n 2, se dice que n 1 es antecesor de n 2, y n 2 es descendiente de n 1 El padre de un subárbol o nodo es su primer antecesor propio. Los hijos de un subárbol o nodo son sus primeros descendientes propios Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 7 Terminología Básica A B C D E F G H I J K L M La altura de un nodo en un árbol es la longitud del camino desde dicho nodo a la hoja más lejana que sea alcanzable desde él La altura de un árbol es la altura del nodo raíz La profundidad o nivel de un nodo en un árbol es la longitud del único camino existente desde el nodo raíz hasta dicho nodo Por definición, el número de niveles de un árbol se define como uno más el nivel de la hoja más profunda. En el nivel 0 sólo está el nodo raíz El grado de un árbol es el número máximo de hijos que pueden tener sus subárboles El número máximo de nodos en el nivel i-ésimo de un árbol de grado n es n i Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 8
3.2 Especificación Algebraica! La operación básica de la signatura de los árboles es la de enraizar un número indeterminado de árboles para formar un nuevo árbol! La sintaxis de las especificaciones algebraicas no permite declarar operaciones con un número indeterminado de parámetros! Debemos definir nuevos conceptos que nos ayuden a construir la especificación algebraica " Un bosque ordenado de grado n (n 1) es una secuencia A 1,, A m (0 m n) de árboles n-arios ordenados. Si m = 0, el bosque se llama vacío " Un árbol n-ario ordenado se genera a partir de un elemento r y un bosque de grado n, considerando al elemento r la raíz del nuevo árbol y el bosque como sus subárboles " Definimos el tipo bosque como una lista en la que los elementos son árboles Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 9 espec arbolesordenados usa booleanos, naturales, listas parámetro formal género elemento fpf renombrar lista<árbol> por bosque géneros árbol operaciones _ Θ _ : elemento bosque # árbol raíz: árbol # elemento hijos: árbol # bosque parcial subárbol: árbol natural # árbol numhijos: árbol # natural hoja?: árbol # booleano altura: árbol # natural privada altbosque: bosque # natural Gen (árbol) = { _ Θ _ } Mod (árbol) = {subárbol} Obs (árbol) = {raíz, hijos, numhijos, hoja?, altural} Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 10
dominios de definición b: bosque; i: natural; e: elemento subárbol (e Θ b, i) está definido sólo si (1 i) (i long (b)) ecuaciones b: bosque; i: natural; e: elemento; a: árbol raíz (e Θ b) = hijos (e Θ b) = subárbol (e Θ b, i) = numhijos (e Θ b) = hoja? (e Θ b) = altura (a) = altbosque ([ ]) = altbosque (+izq (a, b)) = fespec Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 11 3.3 Implementación del árbol n-ario! La implementación se hará de forma dinámica mediante punteros, usando una representación denominada primogénito siguiente hermano " Consiste en crear, para cada nodo, una lista dinámica con sus hijos! el tipo árbol es un puntero a un objeto con tres propiedades: la información correspondiente al elemento raíz, un puntero al objeto correspondiente al primer hijo, y otro puntero al objeto correspondiente al siguiente hermano 3 a 14 15 3 14 15 9 2 6 33 9 2 6 33 Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 12
módulo TadArbol importa TadElemento, TadNodoArbol, TadLista exporta tipo bosque = lista<árbol> árbol = clase público constructor plantar (e: elemento; b: bosque) función observaraíz: elemento acción hijos (var b: bosque) acción subárbol (i: natural; var sa: árbol) función numhijos: natural función eshoja: booleano función altura: natural acción copia (a: árbol) acción libera privado raiz: PtrNodoArbol; fclase; Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 13! Se define una clase NodoArbol, que representa a cada uno de los nodos que forman un árbol tipo PtrNodoArbol = puntero a NodoArbol; nodoarbol = clase público constructor creanodoarbol(e: Elemento; ph,sh:ptrnodoarbol); acción setelemento(e: Elemento); acción setprimhijo(pph: PtrNodoArbol); acción setsighermano(psh: PtrNodoArbol); función getelemento: Elemento; acción getprimhijo: PtrNodoArbol; función getsighermano: PtrNodoArbol; privado elem: Elemento; PrimHijo, SigHermano: PtrNodoArbol; fclase; ftipo; Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 14
acción árbol.plantar (e:elemento; b:bosque) faccion; Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 15 función árbol.subárbol(i: natural; var sa: árbol); función árbol.altura:natural ffunción; faccion; Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 16
3.4 Concepto, especificación e implementación de árbol binario! Un árbol binario ordenado es un árbol en el que cada nodo puede tener, a lo sumo, dos hijos $ es un conjunto de nodos del mismo tipo que, o bien es el conjunto vacío, o está formado por un nodo raíz enlazado a dos árboles binarios disjuntos denominados subárbol izquierdo y subárbol derecho t m k h f d Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 17 Especificación Algebraica espec arbolesbinarios usa booleanos, enteros parámetro formal género elemento fpf género arbin operaciones : # arbin _ < _, _ >: elemento arbin arbin # arbin parcial raíz: arbin # elemento parcial subizq, subder: arbin # arbin vacío?: arbin # booleano parcial altura: arbin # entero dominios de definición iz, de: arbin; e: elemento Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 18
ecuaciones iz, de: arbin; e: elemento raíz (e<iz, de>) = subizq (e<iz, de>) = subder (e<iz, de>) = vacío? ( ) = vacío? (e<iz, de>) = altura (e<iz, de>) = fespec Clasificación de las operaciones: Gen (arbin) = { } Mod (arbin) = { } Obs (arbin) = { } Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 19 Implementación del árbol binario! La clase NodoB, que representa a cada uno de los nodos que forman un árbol binario, es: tipo PtrNodo = puntero a NodoB; nodob = clase público constructor creanodo(e: Elemento; izq,der:ptrnodo); acción setelemento(e: Elemento); acción setizq(pizq: PtrNodo); acción setder(pder: PtrNodo); función getelemento: Elemento; acción getizq: PtrNodo; función getder: PtrNodo; privado elem: Elemento; izq, der: PtrNodo; fclase; ftipo; Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 20
Implementación del árbol binario módulo TadArbolBinario importa TadElemento, TadNodoB exporta tipo arbin= clase público constructor creavacío acción plantar (e: elemento; ai, ad: arbin) función raíz: elemento acción subizq ( var ai: arbin) acción subder ( var ad: arbin) función esvacío: booleano función altura (a: arbin): entero acción copia ( viejo: arbin) acción libera privado raíz: PtrNodo; fclase; raíz dato izq der Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 21 Tipos de árboles binarios! Un árbol binario de altura h se llama completo si tiene todas sus hojas a nivel h y todos sus nodos interiores tienen dos hijos no vacíos! Un árbol binario de altura h se llama semicompleto si los nodos de nivel h y h-1 son los únicos de grado cero o uno, de forma que las hojas del último nivel ocupan las posiciones más a la izquierda de dicho nivel 50 20 80 10 40 74 99 8 35 60 Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 22
3.4 Recorridos sobre árboles Los dos tipos básicos de recorrido para los árboles n-arios ordenados son: PREORDEN - si A no tiene hijos, se visita la raíz de A - si los tiene, primero se visita la raíz de A y, a continuación, se recorren en preorden los subárboles POSTORDEN - si A no tiene hijos, se visita la raíz de A - si los tiene, primero se recorren en postorden los subárboles y a continuación se visita la raíz de A 3 14 15 9 2 6 33 recorrido en preorden: recorrido en postorden: Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 23 Implementación para árboles n-arios acción preorden (a: árbol; var l: lista); acción postorden (a: árbol; var l: lista) facción; facción; Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 24
Implementación para árboles binarios Para los árboles binarios existe otro tipo de recorrido: INORDEN - si A es el árbol vacío, termina el recorrido - si no lo es, primero se recorre en inorden el subárbol izquierdo, a continuación se visita la raíz de A y, por último, se recorre en inorden el subárbol derecho. acción preorden (a: arbin; var l: lista) acción postorden (a: arbin; var l: lista) facción facción Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 25 Implementación para árboles binarios acción InOrden (a: arbin; var l: lista) B A C D E F G facción H K I J Recorrido preorden: Recorrido inorden: Recorrido postorden: Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 26