Facultad de Ciencias Exactas, Ingenierı́a y Agrimensura Escuela de Ciencias Exactas y Naturales Departamento de Computación Estructuras de Datos Práctica 2 Tipos Abstractos de Datos 1. Especificar e implementar como TAD el siguiente tipo de datos: data Tree = Leaf Int |Node Tree Int Tree Definir las siguientes funciones: a) height Que devuelve la altura del árbol. b) nodes Que devuelve la cantidad de nodos del árbol. c) mirror Que devuelve el árbol espejo. 2. Definir una función fBTtQ que toma un árbol y devuelve una Queue con todos los nodos del árbol por niveles partiendo desde el nivel 0. Ejemplo: Para el árbol de abajo el orden de los nodos en la Queue serı́a 4 2 5 1 3 6 3. Un TAD map se utiliza para almacenar una colección de entradas que constan de claves y sus valores. Las claves son únicas, aunque no tienen por qué serlos los valores. La estructura de datos se mantiene ordenada por orden de clave. Las operaciones habituales en una estructura de este tipo son: • Comprobar si está o no vacı́a. • Comprobar si una clave está en la estructura map. • Obtener el número de pares clave/valor almacenados. • Obtener el valor asociado a una clave. • Añadir un nuevo par clave/valor a la estructura de datos. • Eliminar una clave dada y su valor asociado. • Construir una lista ordenada por la clave con los pares clave/valor almacenados en la estructura de datos. Realizar una especificación del TAD map ası́ como de las operaciones mencionadas. Práctica 2 Tipos Abstractos de Datos Página 1 Estructuras de Datos 4. Un monoide es una 3-upla (M , + , e) cuyos elementos cumplen con las siguientes propiedades: • M es un conjunto de elementos (llamado conjunto soporte) • + es una operación binaria, asociativa y cerrada en M • e es un elemento neutro de + Dado el siguiente tipo de datos: data Monoide a = Mon (Set a, a → a → a, a) a) Dar una implementación, en Haskell, del tipo de datos Set y de sus operaciones básicas. b) Especificar el tipo de datos Monoide como TAD. c) Definir una función la cual tome un Monoide, una lista y devuelva una lista cuyos elementos sean los elementos de la lista pasada como argumento (que pertenezcan al conjunto soporte del Monoide), habiendo sido evaluados con la operación del Monoide. Si los elementos a evaluar son una cantidad impar, el elemento que quede solo debe de ser evaluado junto con el elemento neutro del Monoide. Nota sobre el ejercicio: • No se puede usar pattern matching para manipular elementos de tipo Monoide. • Puede suponer la existencia de una función asocS que toma un conjunto y una operación, y devuelve True si la operación es asociativa (False en caso contrario). 5. Un red-black es un árbol binario de búsqueda cuyos nodos están coloreados o con rojo o con negro. data Color = Rojo | Negro data RBTree a = Nil | Nodo Color (RBTree a) a (RBTree a) Además, este tipo de datos cumple con las siguientes reglas de balanceo: • Condición Roja: Todo nodo rojo tiene un padre negro. • Condición Negra: Todos los caminos desde de la raı́z del árbol hasta un nodo vacı́o (Nil) contienen exactamente la misma cantidad de nodos negros. a) Especificar el tipo RBTree como TAD. b) Definir una función insert :: (Ord a) ⇒a → RBTree a → RBTree a que toma un elemento y lo inserta en el red-black tree tomado como segundo argumento. Para esto necesitará definir también una función que controle el balanceo de un red-black tree. 6. Un producto reune un número fijo (finito) de componentes en una sola unidad de datos; por ejemplo una tupla. Ahora bien, un tipo producto accede a sus elementos de manera posicional, lo que trae muchos inconvenientes a la hora de trabajar con unidades de datos de muchas componentes. Para solucionar este problema, se implementaron los “Records”. Un Record es un producto etiquetado, o sea, a cada componente se le asocia una label la cual la diferenciará de las demás componentes. Dichas labels tienen que ser todas distintas entre si ya que , ahora, el acceso a las componentes se hara buscando su label asociada y no según su posición. las operaciones básicas de los Records son: Práctica 2 Tipos Abstractos de Datos Página 2 Estructuras de Datos • Acceder a una componente según su label asociada. • Modificar una componente (cambiar su valor). a) Realizar una especificación de los records como TAD y de sus operaciones antes mencionadas. b) ¿Qué operaciones agregarı́a a las operaciones básicas para poder extender los Records? Definirlas. c) Modificar lo hecho en el item a utilizando las funciones definidas en el item b. Práctica 2 Tipos Abstractos de Datos Página 3