1. Se tiene un árbol binario de búsqueda, apuntado por la variable estática, de tipo pnodo, denominada raiz. a) Diseñar la función recursiva mr, tal que la siguiente invocación, deje como nodo raíz el nodo con mayor valor de clave: raiz = mr( raiz); 50 puntos. b) Diseñar la función iterativa m, tal que la siguiente invocación, deje como nodo raíz el nodo con mayor valor de clave: m( & raiz); 50 puntos. En ambos casos el árbol resultante debe ser binario de búsqueda. Solución. pnodo lrot( pnodo t) { pnodo temp = t->right; t->right = temp->left; temp->left = t; return ( temp ); } //Coloca en la raíz el nodo con mayor valor. Iterativo void m( pnodo * pp) { while( *pp != NULL) if ( (*pp)->right != NULL ) *pp = lrot(*pp); else break; } //Coloca en la raíz el nodo con mayor valor. Recursivo pnodo mr( pnodo t) { if( t != NULL) if (t->right != NULL) { t->right = mr(t->right); t = lrot(t); } return (t); } Notar que la función recursiva deja al árbol más balanceado. Balanceado completo 8 / \ / \ / \ / \ / \ / \ / \ 4 12 / \ / \ / \ / \ / \ / \ 2 6 10 14 / \ / \ / \ / \ 1 3 5 7 9 11 13 15 Iterativo Recursivo 15 / 14 / 12 / \ 8 13 / \ / \ / \ 4 10 / \ / \ / \ 9 11 / \ 2 6 / \ / \ 1 3 5 7 15 / 8 / \ / \ / \ / \ / \ / \ / \ 4 12 / \ / \ / \ / \ / \ / \ 2 6 10 14 / \ / \ / \ / 1 3 5 7 9 11 13 2. Se tiene una tabla de hash abierto: a) Si se cambia el tamaño de la tabla, es necesario cambiar la función de hash, dar razones. 20 puntos. b) Si la función de hash es: f(x) = (3x+5)%11, indicar para los siguientes valores de la clave x, cuáles elementos colisionan entre sí. Valores de clave = {5, 9, 11, 20}. 20 puntos. c) Qué dificultades visualiza, en el diseño de las operaciones, si la función insertar acepta incorporar elementos repetidos. Efectué un análisis para cada operación sobre la tabla. 20 puntos. d) Explicar si encuentra o no razonable lo siguiente: “Si una entrada de una tabla de hash presenta una lista de colisiones con más de cuatro elementos, debe evitarse insertar nuevos elementos en esa entrada”. 20 puntos. e) ¿Pueden o no almacenarse claves con valores negativos?. La función de hash debe cumplir alguna restricción para estos casos. 20 puntos. Solución. a) Las funciones de hash deben generar números entre 0 y B-1, donde B es el número de entradas de la tabla de punteros. Por lo tanto si cambia B, el tamaño de la tabla, también debe modificarse la función para que genere números entre 0 y el nuevo tamaño de la tabla. b) f(5) =9, f(9)=10, f(11)=5, f(20)=10. Los elementos con claves 9 y 20 generan el mismo valor de hash, y por lo tanto colisionan entre sí. c) La operación insertar al inicio de la tabla, permanece de complejidad O(1), sin embargo se alarga la lista de colisiones. La operación buscar es menos eficiente, debido a que se tendrán largos mayores en las listas de colisiones. Descartar se ve afectada, ya que antes de descartar debe buscar el elemento. Más aumenta la complejidad si en el diseño se considera descartar todas las ocurrencias de la clave. d) Al acotar el número de colisiones se limita fuertemente la estructura para buscar elementos. Perdería su principal funcionalidad. e) Pueden almacenarse números con claves con valores negativos; la función de hash, debe generar solamente números positivos, entre 0 y el tamaño de la tabla.