ILI-134 Estructuras de Datos, 2011-2 Profesor: Diego Arroyuelo UTFSM, Campus San Joaquı́n Guı́a de Ejercicios: Árboles Los siguientes ejercicios asumen que el alumno ha implementado los TAD correspondientes a cada uno de los tipos de árboles (árboles generales, árboles binarios, árboles binarios de búsqueda, árboles AVL). 1. Árboles Generales 1. Diseñar un algoritmo recursivo para calcular la altura de un árbol general. 2. Diseñar un algoritmo no recursivo para calcular la altura de un árbol general. 3. Escriba un algoritmo recursivo para calcular el grado de un árbol general. 4. Escriba un algoritmo devuelva el número de hojas de un árbol general. 2. Árboles Binarios 1. Escribir un algoritmo que permita hacer un barrido por niveles de un árbol binario. ¿Qué tipo de estructura auxiliar necesita emplear? 2. Escribir un algoritmo no recursivo que permita hacer un barrido por profundidad de un árbol binario. ¿Qué tipo de estructura auxiliar necesita emplear? 3. Diseñar un algoritmo no recursivo para recorrer un árbol binario en inorden. 4. Diseñar un algoritmo no recursivo para recorrer un árbol binario en postorden. 5. Escribir un algoritmo recursivo que cuente el número de nodos de un árbol binario. 6. Escribir una función recursiva que encuentre la altura de un árbol binario. 7. El recorrido en preorden de un determinado árbol binario (cuyos nodos han sido rotulados A, . . . , M) produce como resultado la secuencia de nodos G E A I B M C L D F K J H, y el recorrido inorden produce la secuencia I A B E G L D C F M K H J. a) Dibujar el árbol binario correspondiente. b) Dar el recorrido en postorden sobre dicho árbol. c) Diseñar un algoritmo para obtener el recorrido en postorden de un árbol dado el recorrido en preorden e inorden sobre el mismo. No se puede reconstruir el árbol explı́citamente para obtener el recorrido postorden. 1 8. ¿Es posible generar un árbol binario a partir únicamente de uno de sus recorridos preorden, inorden o postorden? ¿Y a partir de dos recorridos diferentes (examinar todos los pares posibles)? Dar los algoritmos para los casos que sean realizables. 9. Se define por frontera de un árbol binario, la secuencia formada por los elementos almacenados en las hojas de un árbol binario, tomados de izquierda a derecha. Diseñar un algoritmo que genere una lista (es decir, del TAD tLista) con la frontera de un árbol binario dado. 10. Diseñar un algoritmo que obtenga el recorrido por niveles inverso de un árbol binario dado. En este recorrido, primero se listan (de izquierda a derecha) los nodos del último nivel del árbol, luego los del penúltimo nivel, y ası́ sucesivamente hasta llegar a la raı́z. 11. Diseñar un algoritmo que obtenga el recorrido por niveles inverso modificado de un árbol binario dado. En este recorrido, primero se listan (de derecha a izquierda) los nodos del último nivel del árbol, luego los del penúltimo nivel, y ası́ sucesivamente hasta llegar a la raı́z. 12. Diseñar un algoritmo que reciba como entrada los recorridos prefijo e infijo de un árbol binario y retorne como salida el recorrido por niveles de dicho árbol. Para obtener la solución no se puede construir el árbol de manera explı́cita. 13. Diseñe un algoritmo que calcule el número de nodos completos de un árbol binario. Un nodo completo es uno que tiene dos hijos no vacı́os. 14. Demostrar por inducción que el máximo número de nodos en un árbol binario de altura h es 2h+1 − 1. 15. Un árbol monodistante de orden N es un árbol binario de números enteros en el que la suma de los valores de los nodos de cada camino que va desde la raı́z a un nodo hoja es igual a N . a) Implementar una función que determine si un árbol binario de enteros es monodistante de orden N , para un N dado. b) ¿Cuál es el tiempo de ejecución de su algoritmo en el peor caso? 16. Sea S = ha0 , a1 , . . . , an−1 i una secuencia finita de números enteros. Sobre S se desea soportar las siguientes operaciones: acceso(S, i): encontrar ai . sumaParcial(S, k): permite calcular la suma parcial Pk i=0 ai Diseñe una estructura de datos basada en un árbol binario que represente a S y permita soportar las operaciones solicitadas de manera eficiente. Muestre el algoritmo para soportar dichas operaciones. ¿Cuál es el tiempo de ejecución para cada una de las operaciones? Use la notación asintótica más adecuada para este caso (O, Ω o Θ). Ayuda: construya un árbol binario cuyas hojas contengan los elementos de la secuencia, de izquierda a derecha. Sólo resta definir la estructura y el contenido de los nodos internos del árbol. 3. Árboles Binarios de Búsqueda (ABB) 1. Para cada una de las siguientes secuencias de números enteros, muestre el ABB obtenido cuando estos valores son insertados uno por uno en el orden dado, asumiendo que el árbol está inicialmente vacı́o. Muestre el árbol resultante de cada una de las inserciones. a) 1, 2, 3, 4, 5, 6, 7. b) 4, 2, 1, 3, 6, 5, 7. c) 1, 6, 7, 2, 4, 3, 5. 2 2. Para cada uno de los ABB obtenidos en el Ejercicio 1, muestre el árbol que se obtiene cuando se borra la raı́z. 3. a) ¿Cuál de los ABB del Ejercicio 1 producirá el menor costo de búsqueda en el peor caso? b) ¿Cuál de los ABB del Ejercicio 1 producirá el mayor costo de búsqueda en el peor caso? En ambos casos explique las razones. Además, medite acerca de los tipos de secuencias de inserciones que producen buenos/malos ABB. 4. Mostrar cinco secuencias de inserción de los valores 1, 2, 3, 4, 5, 6, 7 tal que, cuando se inserten en un ABB inicialmente vacı́o, produzcan un ABB con el menor costo de búsqueda en el peor caso. 5. Mostrar cinco secuencias de inserción de los valores 1, 2, 3, 4, 5, 6, 7 tal que, cuando se inserten en un ABB inicialmente vacı́o, produzcan un ABB con el mayor costo de búsqueda en el peor caso. 6. Mostrar paso a paso el ABB para las claves 50, 25, 75, 10, 40, 60, 90, 35, 45, 70, 42, asumiendo que los valores son insertados en ese orden y que el árbol estaba inicialmente vacı́o. 7. Mostrar paso a paso el ABB para las claves 3, 1, 4, 6, 9, 2, 5, 7, asumiendo que los valores son insertados en ese orden y que el árbol estaba inicialmente vacı́o. Mostrar el resultado de borrar la raı́z. 8. ¿Puede reconstruirse de forma única un ABB dado su recorrido inorden? ¿Y dados el preorden y el postorden? 9. Diseñe un algoritmo que indique si un árbol binario dado cumple las condiciones para ser un ABB o no. ¿Cuál es el tiempo de ejecución de su algoritmo? Use la notación asintótica más adecuada para este caso (O, Ω o Θ). 10. Diseñar algoritmos para calcular el mı́nimo y el máximo elemento de un árbol binario de búsqueda. ¿Cuál es el tiempo de ejecución de su algoritmo? Use la notación asintótica más adecuada para este caso (O, Ω o Θ). 11. Diseñar un algoritmo tal que dado un ABB y dos lı́mites LI y LS, construya un nuevo ABB con los elementos del árbol original que se encuentran dentro de esos lı́mites. Su algoritmo deberı́a recorrer la mı́nima cantidad posible de nodos del árbol. Analice la complejidad temporal de su algoritmo en el peor caso, y en el caso promedio, asumiendo que la cantidad de nodos del árbol es n, y que N es la cantidad de nodos cuyos valores se encuentran dentro del intervalo dado. Use la notación asintótica más adecuada para este caso (O, Ω o Θ). 12. Para borrar un nodo no hoja de un ABB, lo intercambiamos ya sea con el elemento más pequeño dentro de su subárbol derecho, o con el mayor elementos dentro de su subárbol izquierdo. En un árbol de n nodos, ¿Cuál es el máximo número de intercambios necesarios para borrar un elemento? 13. Usted debe mantener datos para alguna aplicación. Sus opciones son: Una lista enlazada ordenada (es decir, los datos se almacenan ordenados de forma creciente). Una lista enlazada desordenada. Un ABB. Una lista ordenada basada en arreglo. una lista desordenada basada en arreglo. Para cada uno de los siguientes escenarios, ¿Cuáles de las siguientes opciones serı́a la mejor? Justifique su respuesta. a) Los datos llegarán ordenados de menor a mayor. Un total de 1.000 inserciones serán intercaladas con 1.000 búsquedas. 3 b) Los datos llegarán bajo una distribución uniforme (es decir, cualquiera de los valores posibles de los datos tienen la misma probabilidad de ocurrir). Se realizarán 1.000.000 de inserciones, seguidas por 10 búsquedas. c) Los datos llegarán bajo una distribución uniforme. 1.000 inserciones se intercalarán con 1.000 búsquedas. d ) Los datos llegarán bajo una distribución uniforme. Se realizarán 1.000 inserciones, seguidas por 1.000.000 de búsquedas. 4. Árboles AVL 1. Dibuje el AVL resultante de insertar cada uno de los valores 20, 16, 44, 57, 93, 32, 65, 19, 8 y 17, en ese orden. El AVL es inicialmente vacı́o. Dibuje cada uno de los pasos de la inserción, ası́ como las rotaciones producidas. 2. Dibuje el AVL resultante de insertar cada uno de los valores 35, 18, 9, 58, 14, 49, 51, 67, 60, en ese orden. El AVL es inicialmente vacı́o. Dibuje cada uno de los pasos de la inserción, ası́ como las rotaciones producidas. 3. Dibuje el AVL resultante de insertar cada uno de los valores 24, 14, 6, 35, 59, 17, 21, 32, 4, 7, 15, 22, en ese orden. El AVL es inicialmente vacı́o. Dibuje cada uno de los pasos de la inserción, ası́ como las rotaciones producidas. 4. Dibuje el AVL resultante de insertar cada uno de los valores 13, 7, 21, 15, 27, 18, 4, 11, 30, en ese orden. El AVL es inicialmente vacı́o. Dibuje cada uno de los pasos de la inserción, ası́ como las rotaciones producidas. Luego elimine los elementos: 13, 4, 15, en ese orden. 4