Instituto de Computación. Facultad de Ingeniería. Universidad de la República Parcial de Programación 2 Mayo de 2013 Generalidades: • La prueba es individual y sin material; la duración es 3 horas; sólo se contestan dudas acerca de la letra de los ejercicios. • Escriba las hojas de un sólo lado y con letra clara; comience la solución de cada ejercicio en una nueva hoja; numere cada hoja, indicando en la primera el total; coloque su número de cédula y nombre en cada hoja. SI TODAS LAS RESTRICCIONES EXPLICITADAS DE UN EJERCICIO NO SON CUMPLIDAS POR LA SOLUCIÓN PROPUESTA, EL EJERCICIO TENDRÁ PUNTAJE 0. PRESTAR ATENCIÓN A LAS NOTAS INCLUÍDAS EN CADA EJERCICIO. • Ejercicio 1 (14 puntos) Considere las siguientes declaraciones, en Modula-2, del tipo de las listas de números enteros LInt y del tipo de las listas de números enteros con cantidad de ocurrencias LCantInt. LInt = POINTER TO NodoLista; LCantInt = POINTER TO NodoCantLista; NodoLista = RECORD info : INTEGER; sig : LInt END; NodoCantLista = RECORD info : INTEGER; cant : CARDINAL; sig : LCantInt END; Se pide, accediendo directamente a la representación, implementar la siguiente función iterativa: ordenar: que dada una lista de enteros de tipo LInt, con valores en el rango [1:K], con K un valor entero constante, retorne una lista compacta de tipo LCantInt ordenada, de menor a mayor, donde cada elemento x contenga la cantidad de ocurrencias del mismo en la lista parámetro (x, cant_x). La función debe tener O(n) de tiempo de ejecución en el peor caso, siendo n la cantidad de elementos de lista parámetro. PROCEDURE ordenar (L:LInt): LCantInt; No se permite definir procedimientos ni funciones auxiliares. No obstante, se sugiere utilizar una estructura de datos estática auxiliar, teniendo en cuenta que K es un valor constante, con el objetivo de satisfacer la restricción temporal exigida para la función ordenar. Ejemplos: Entradas (asumiendo K ≥ 9 en los ejemplos) Resultado de ordenar L = [9, 5, 2, 5, 9, 5] [(2,1), (5,3), (9,2)] (el 2 ocurre una vez, el 5 ocurre 3 veces y el 9 ocurre 2 veces) L = [9, 5, 2, 5, 4, 1, 7, 9, 3, 4, 3, 9] [(1,1), (2,1), (3,2), (4,2), (5,2), (7,1), (9,3)] L = [9,2,5] [(2,1), (5,1), (9,1)] L = [] [] Ejercicio 2 (14 puntos) Considere la siguiente declaración, en Modula-2, del tipo de los árboles binarios de búsqueda de enteros: ABB = POINTER TO ABNode; ABNode = RECORD raiz : INTEGER; izq : ABB; der : ABB; END; Se pide, accediendo directamente a la representación, implementar la siguiente función recursiva: copia: que dados un árbol binario de búsqueda de enteros A de tipo ABB (sin elementos repetidos) y un entero x, retorne una copia del subárbol de A que tenga a x como raíz. Si x no pertenece al árbol A, el resultado debe ser el árbol vacío. La función debe retornar un árbol que no comparta memoria con el árbol parámetro. PROCEDURE copia (A:ABB; x:INTEGER): ABB; Si usa procedimientos o funciones auxiliares, deberá implementarlos. Ejemplo: 8 3 9 2 y x=7 copia 7 7 4 4 6 6 Para el árbol de arriba y x = 5, copia retorna el árbol vacío. Lo mismos ocurre si el árbol es vacío, independientemente del valor de x. Ejercicio 3 (12 puntos) Considere árboles generales (finitarios) de naturales representados como árboles binarios con la semántica: “primer hijo”–“siguiente hermano”, de tipo ARBOL. ARBOL = POINTER TO Nodo; Nodo = RECORD dato: CARDINAL; primerHijo: ARBOL; sigHermano: ARBOL; END; Escriba, accediendo directamente a la representación y sin definir operaciones auxiliares, un procedimiento recursivo: PROCEDURE Min (A:ARBOL; k:CARDINAL; VAR dirMin:ARBOL); que dado un árbol general no vacío A, representado por uno binario de tipo ARBOL, sin elementos repetidos y un número natural k mayor que 0, deje en dirMin un puntero el mínimo elemento de A que se encuentra en los primeros k niveles del árbol. Si k es mayor a la altura de A, el procedimiento debe almacenar en dirMin el puntero al mínimo elemento del árbol. Por ejemplo, dado el siguiente árbol general: 7 2 1 9 10 6 5 8 3 12 15 11 4 13 El procedimiento debe dejar en dirMin un puntero al nodo con dato 7 si k es 1; un puntero al nodo con dato 2 si k es 2; y un puntero al nodo con dato 1 si k ≥ 3.