UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos 7/6/2010 Segundo Examen 7 1. Para el siguiente árbol de búsqueda. 3 a) ¿Cuáles son todos los órdenes posibles en los que llegaron las claves para formar el árbol? 739148, 739184, 739418, 739481, 739814, 739841, 793148, 793184, 793418, 793481, 793814, 793841 1 9 4 8 b) En un listado pre-orden quienes figuran antes y después del valor 4. Pre orden: 7, 3, 1, 4, 9, 8 entonces son el 1 y el 9. c) En un listado post-orden quienes figuran antes y después del valor 9. Post orden: 1, 4, 3, 8, 9, 7 entonces son el 8 y el 7. d) Dibujar el árbol, luego de: insertar el nodo con valor 5, y descartar los nodos con valores 4 y luego el 7. 5 7 7 8 3 3 9 9 3 3 9 9 1 4 8 1 5 1 8 8 o 1 5 5 Indicar alternativas de solución, si las hubiera. 20 puntos 2. a) Diseñe una función recursiva que cuente los nodos en un árbol binario en orden con valores entre dos valores dados (inclusive) e imprima esos nodos a la pantalla. Retorne el número de nodos contados. int ContarNodos (pnodo t, char valor1, char valor2); int ContarNodos(pnodo t, char valor1, char valor 2) { // dado que valor1 <= valor2 int total=0; if (t != NULL) { total += ContarNodos(t->left); if ((t->clave >= valor1) && (t->clave <= valor2)) total++; total += ContarNodos(t->right); } return (total); } Tomás Arredondo Vidal. 22-07-2010 1 20 puntos UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos b) Diseñe una función que en un árbol binario inserte el nodo correspondiente a la clave. Debe permitir que se almacenen múltiples copias de un nodo y resolver colisiones de alguna manera razonable. Retorne cero si no hay error. Debe diseñar su nodo. int InsertarMultiple(char clave, pnodo t); 20 puntos typedef struct Node { char clave; int cuenta; // cuenta el numero de veces struct Node *left; struct Node *right; } nodo, *pnodo; typedef enum {left, right, vacio} modo; void InsertarMult(pnodo t, int valor) { pnodo q= t; modo porlado=vacio; while ( t != NULL) { if ( t->clave == valor ) { /* lo encontro, incrementa cuenta */ t->cuenta++; return; } else { q=t ; if (t->clave < valor) { t = t->right; porlado=right; } else { t = t->left; porlado=left; } } } /*Al salir del while q apunta al nodo en el arbol donde se insertar el nuevo nodo, y porlado la direccin */ Tomás Arredondo Vidal. 22-07-2010 2 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos /* El argumento t apunta a NULL */ t = CreaNodo(valor); // podia asumir crea nodo if (porlado==left) q->left=t; else if (porlado==right) q->right=t; // return (t); /* Apunta al recien insertado*/ } main() { pnodo pRoot = NULL; // Digamos que queremos almacenar 7, 8, 10, 11, 7, 9 // El primero tiene que ser creado con CreaNodo pRoot = CreaNodo(7); InsertarMult(pRoot, 8); InsertarMult(pRoot,10); InsertarMult(pRoot,11); InsertarMult(pRoot, 7); InsertarMult(pRoot, 9); } Cual es la complejidad T(n), O(n) y Θ(n) de la función en la parte b)? 20 puntos. La suma de T(n) va a depender de la implementacion pero O(logn) = Θ(logn). 3. Para una tabla de hash cerrado de tamaño 8, implemente una función de hash: h(x). Considere la siguiente secuencia de operaciones: Insertar 13 Insertar 20 Descartar 4 Insertar 13 Insertar 5 Insertar 10 Insertar 6 Buscar 8 Insertar 10 Tomás Arredondo Vidal. Indice 0 1 2 3 4 5 6 7 22-07-2010 Valor Estado 3 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos a) Muestre el contenido de la tabla después de realizadas las operaciones anteriores, asumiendo linear probing para resolver colisiones. Indicando cuándo se producen colisiones y la razón por la que se almacena en una posición determinada. h(x) = x % 8 Indice Valor Estado h(13) = 5, h(20) = 4, h(5) = 5, h(10) = 2, h(6) = 6, h(8) = 0, h(10) =2 b) Luego de lo anterior, indicar fundamentadamente qué casos de inserciones o búsquedas tienen mayor costo, indicando el número de comparaciones que son necesarias. 20 puntos 0 1 2 3 4 5 6 7 10 20 13 5 6 Vacio Vacio Ocupado Vacio Ocupado Ocupado Ocupado Ocupado De acuerdo a esta función de hash, hubo dos colisiones al insertar el 13 y el 10. Buscar el 8 requirió que se mirara la tabla completa lo mismo con descartar el 4. Insertar el 5 y 6 requirió incrementar indice para resolver colisiones. Tomás Arredondo Vidal. 22-07-2010 4