Universidad Técnica Federico Santa María - Departamento de Informática Estructura de Datos Árboles Binarios de Búsqueda ABB Prof.: Mauricio Solar Prof.: Lorna Figueroa Primer Semestre, 2010 1 Universidad Técnica Federico Santa María - Departamento de Informática Arboles de Búsqueda Binaria • El árbol binario de búsqueda (ABB) toma su nombre del método de búsqueda dicotómico usado para listas ordenadas, • usa un array para mantener un conjunto de items (número de items limitado, y operaciones de inserción y borrado de elementos costosas). • Una implementación dinámica sería muy ineficiente. • Otra solución consistiría en utilizar un árbol para mantener la información ordenada, con operaciones de inserción y extracción muy eficientes. 2 Universidad Técnica Federico Santa María - Departamento de Informática Arboles de Búsqueda Binaria • El TAD ABB es un árbol binario en el que los nodos están ordenados. • El orden impuesto a los nodos es tal que para cada nodo, todos los valores de su subárbol izquierdo son menores que su valor, y todos los valores del derecho son mayores. • El tipo base requiere una relación de orden total. • Un árbol ordenado lleno permite la búsqueda óptima de sus elementos. 3 Universidad Técnica Federico Santa María - Departamento de Informática Arboles de Búsqueda Binaria • En un árbol binario ordenado cada vez que se compara el elemento buscado con la raíz se decide si continuar hacia abajo por la derecha o por la izquierda, dejando así la mitad de los nodos a un lado. • En un número de comparaciones proporcional a la altura del árbol (h ≈ log2(N)) se habrá decidido si el elemento está o no en el árbol. • Por ejemplo, si hay 32.768 (= 215) elementos en el árbol de búsqueda lleno, sólo se requieren 15 comparaciones. 4 Universidad Técnica Federico Santa María - Departamento de Informática Arboles de Búsqueda Binaria • Los árboles binarios de búsqueda son estructuras de datos con un gran rendimiento cuando las tareas a realizar implican búsquedas, inserciones y eliminación de nodos. • No basta con almacenar la información en un árbol para facilitar la búsqueda, se debe utilizar un tipo especial de árbol: un árbol binario de búsqueda. • Si además se quiere que la búsqueda sea eficiente se deben utilizar árboles de búsqueda binarios equilibrados. 5 Universidad Técnica Federico Santa María - Departamento de Informática Árboles de Búsqueda Binaria 15 9 3 27 21 18 30 24 6 Universidad Técnica Federico Santa María - Departamento de Informática ABB - Definición Un árbol binario de búsqueda es una estructura de datos en el que para todos sus nodos, el hijo izquierdo, si existe, contiene un valor menor que el nodo padre y el hijo derecho, si existe, contiene un valor mayor que el del nodo padre. 15 9 3 27 21 18 30 24 7 Universidad Técnica Federico Santa María - Departamento de Informática ABB - Definición • Se define ABB para un conjunto S, como un árbol binario rotulado, en que cada nodo v tiene un rótulo l(v) tal que : • Para todo u en el subárbol derecho de v, l(u) > l(v) • Para todo u en el subárbol izquierdo de v, l(u) < l(v) • Para a ∈ S, existe un único v tal que l(v) = a 8 Universidad Técnica Federico Santa María - Departamento de Informática El TAD ABB • Son una subclase muy importante del TAD AB ya que permiten el ordenamiento y búsqueda de datos en forma simple y eficiente. • La especificación del TAD ABB es muy similar a la de AB. 9 Universidad Técnica Federico Santa María - Departamento de Informática El TAD ArbolBB Operaciones: • CrearArbol → ArbolBB • Su resultado es la creación de un ABB vacío. • ArbolVacio(ArbolBB) → Logico • Devuelve cierto si el argumento de entrada es un ABB vacío, falso en caso contrario. • BuscarNodo(ArbolBB, TElemento x) → ArbolBB • A partir de un ABB y de un valor de tipo base, el resultado es el ABB cuyo nodo raíz contiene dicho valor. 10 Universidad Técnica Federico Santa María - Departamento de Informática El TAD ArbolBB • • InsertarNodo(ArbolBB, TElemento x) → ArbolBB • A partir de un ABB y de un valor de tipo base, el resultado es un nuevo ABB en el que se ha añadido el nuevo valor (es decir, la inserción es ordenada). EliminarNodo(ArbolBB, TElemento x) → ArbolBB • A partir de un ABB y de un valor de tipo base, el resultado es un nuevo ABB en el que se ha eliminado el nodo que contenía la información de tipo base. Existen tres casos posibles: a) Que el nodo sea una hoja b) Que el nodo a eliminar tenga sólo un hijo c) Que el nodo a eliminar sea un nodo interior 11 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejemplo Para la secuencia: 15, 18, 14, 5, 10, 12, 7, se construye el ABB: 15 18 14 5 10 7 12 InOrden : 5, 7, 10, 12, 14, 15, 18 12 Universidad Técnica Federico Santa María - Departamento de Informática El TAD ABB – Ejemplo • Debido al orden impuesto sobre los elementos de un ABB no vacío el menor de ellos es aquel que está almacenado en el nodo más a la izquierda del mismo. ArbolBB ArbolBBMinimo Minimo(AB (ABab) ab) {{ /* /*pre: pre:ab abes esun unABB ABBno novacío vacío post: post:retorna retornaelelmínimo mínimoelemento elementode deab ab*/ */ ifif(ArbolVacio(SubArbIzq(ab))) (ArbolVacio(SubArbIzq(ab))) return returnRaizAB(ab); RaizAB(ab); else else return returnMinimo(SubArbIzq(ab)); Minimo(SubArbIzq(ab)); }} 13 Universidad Técnica Federico Santa María - Departamento de Informática ABB – BuscarNodo • • • • • Suponga que se busca un elemento x en el árbol. Lo primero es comprobar si se encuentra en el nodo raíz. Si no es así, si el elemento buscado es menor que el contenido en el nodo raíz se deduce que, de estar en el árbol, se encuentra en el subárbol izquierdo. Si el elemento buscado es mayor que el contenido en el nodo raíz se deduce que, de estar en el árbol, se encuentra en el subárbol derecho. Para continuar la búsqueda en el subárbol adecuado se aplica recursivamente el mismo razonamiento. 14 Universidad Técnica Federico Santa María - Departamento de Informática ABB – BuscarNodo • El esquema del algoritmo será el siguiente : 1. Si el valor del nodo actual es igual al valor buscado Î encontrado. 2. Si valor buscado es menor que el del nodo actual Î buscar en el subárbol izquierdo. 1. Si valor buscado es mayor que el del nodo actual Î buscar en el subárbol derecho. 1. Si el valor no está en el árbol Î no encontrado. 15 Universidad Técnica Federico Santa María - Departamento de Informática ABB – BuscarNodo – Implementación typedef typedefint intTipoElemento; TipoElemento; typedef typedefstruct structnodo nodo{{ TipoElemento TipoElementodato; dato; struct structnodo nodo*izq; *izq; struct structnodo nodo*der; *der; }}Nodo; Nodo; typedef typedefNodo* Nodo*ArbolBinar; ArbolBinar; Autor: Ing Rolando Simon Titiosky 16 Universidad Técnica Federico Santa María - Departamento de Informática ABB – BuscarNodo – Implementación Nodo Nodo*BuscarNodo(Nodo *BuscarNodo(Nodo*raiz, *raiz,TipoElemento TipoElementobuscado) buscado) {{ if(!raiz) if(!raiz) return /*Árbol return0; 0; /*Árbolvacío*/ vacío*/ else elseifif(buscado (buscado== ==raiz–>dato) raiz–>dato) return returnraiz; raiz; else elseifif(buscado (buscado<<raiz–>dato) raiz–>dato) return returnBuscarNodo(raiz–>izq, BuscarNodo(raiz–>izq,buscado); buscado); else else return returnBuscarNodo(raiz–>der, BuscarNodo(raiz–>der,buscado); buscado); Autor: Ing Rolando Simon Titiosky }} 17 Universidad Técnica Federico Santa María - Departamento de Informática ABB – BuscarNodo – Implementación 2 tAB* tAB*BuscarNodo2 BuscarNodo2(tAB (tAB*A; *A;tElemento tElementox) x){{ tAB tAB pp==A; A; BOOLEAN BOOLEANenc; enc; enc enc==false; false; while while((((!!enc) enc)&& &&((p!= p!=NULL NULL)))){{ enc enc==pp-> ->info info== ==x; x; ifif!!enc enc ifif(x (x<<pp-> ->info info)) pp==SubArbolIzq(p); SubArbolIzq(p); else else pp==SubArbolDer(p); SubArbolDer(p); }} Si el resultado devuelto es NULL, significa return returnp; p; que no se ha encontrado el elemento buscado }} 18 Universidad Técnica Federico Santa María - Departamento de Informática ABB – InsertarNodo • La inserción de un elemento está basado en el algoritmo de búsqueda. Se determina si el elemento está en el árbol, • Si está, no se inserta. • En caso contrario, se agrega como hoja. • 19 Universidad Técnica Federico Santa María - Departamento de Informática ABB – InsertarNodo • Ciclo: mientras no sea un árbol vacío o hasta que se encuentre el elemento. Si el valor del nodo raíz es mayor que el elemento buscado, continuar la búsqueda en el árbol izquierdo: • Padre = nodo • nodo = nodo -> izq • • Si el valor del nodo raíz es menor que el elemento buscado, continuar la búsqueda en el árbol derecho: • Padre = nodo • nodo = nodo -> der 20 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios • Para cada secuencia, construir el ABB correspondiente determinar recorrido en: InOrden – Postorden – PreOrden • 10 – 5 – 7 – 14 – 12 – 18 – 15 • 15 – 18 – 4 – 5 – 10 – 12 – 7 y 21 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para : 10 – 5 – 7 – 14 – 12 – 18 – 15 Arbol vacío NULL 22 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para : 10 – 5 – 7 – 14 – 12 – 18 – 15 Arbol vacío NULL Insertar 10: 10 23 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para : 10 – 5 – 7 – 14 – 12 – 18 – 15 Arbol vacío NULL Insertar 10: Insertar 5: 10 10 5 24 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para : 10 – 5 – 7 – 14 – 12 – 18 – 15 Arbol vacío NULL Insertar 10: Insertar 5: 10 10 5 Insertar 7: 10 5 7 25 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para : 10 – 5 – 7 – 14 – 12 – 18 – 15 Insertar 14: 10 14 5 7 26 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para : 10 – 5 – 7 – 14 – 12 – 18 – 15 Insertar 14: Insertar 12: 10 10 14 5 7 14 5 7 12 27 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para : 10 – 5 – 7 – 14 – 12 – 18 – 15 Insertar 14: Insertar 12: 10 Insertar 18: 10 14 5 10 14 5 7 7 14 5 12 7 12 18 28 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para : 10 – 5 – 7 – 14 – 12 – 18 – 15 Insertar 15: 10 14 5 7 18 12 15 InOrden: 5 – 7 – 10 – 12 – 14 – 15 - 18 29 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Entrada: 15 – 18 – 4 – 5 – 10 – 12 – 7 Arbol vacío NULL 30 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Entrada: 15 – 18 – 4 – 5 – 10 – 12 – 7 Arbol vacío NULL Insertar 15: 15 31 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Entrada: 15 – 18 – 4 – 5 – 10 – 12 – 7 Arbol vacío NULL Insertar 15: Insertar 18: 15 15 18 32 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Entrada: 15 – 18 – 4 – 5 – 10 – 12 – 7 Arbol vacío NULL Insertar 15: Insertar 18: 15 15 Insertar 4: 15 18 4 18 33 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para: 15 – 18 – 4 – 5 – 10 – 12 – 7 Insertar 5: 15 18 4 5 34 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para: 15 – 18 – 4 – 5 – 10 – 12 – 7 Insertar 5: Insertar 10: 15 15 18 4 4 18 5 5 10 35 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para: 15 – 18 – 4 – 5 – 10 – 12 – 7 Insertar 5: 15 15 15 18 4 Insertar 12: Insertar 10: 4 18 5 5 5 10 18 4 10 12 36 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para: 15 – 18 – 4 – 5 – 10 – 12 – 7 Insertar 7: 15 18 4 5 10 7 12 InOrden: 4 – 5 – 7 – 10 – 12 – 15 – 18 37 Universidad Técnica Federico Santa María - Departamento de Informática ABB – InsertarNodo – Implementación Es Esuna unaextensión extensiónde delalaoperación operaciónde deBúsqueda Búsqueda ––Si Sielelárbol árbolestá estávacío vacíose seinserta insertadirectamente directamente ––SINO: SINO:Buscará Buscaráen enelelárbol árbolelellugar lugarcorrecto correctode deInserción Inserción void voidInsertarNodo InsertarNodo(Nodo** (Nodo**raiz, raiz,TipoElemento TipoElementodato) dato) {{ ifif(!(*raiz)) (!(*raiz)) *raiz *raiz==CrearNodo(dato); CrearNodo(dato); else elseifif(dato (dato<<(*raiz) (*raiz)>dato) >dato) InsertarNodo(&((*raiz) InsertarNodo(&((*raiz)>izdo), >izdo),dato); dato); else else InsertarNodo(&((*raiz) InsertarNodo(&((*raiz)>dcho), >dcho),dato); dato); Autor: Ing Rolando Simon Titiosky }} 38 Universidad Técnica Federico Santa María - Departamento de Informática ABB – InsertarNodo – Implementación 2 void voidInsertarNodo_2 InsertarNodo_2(tAB (tAB**A; **A;tElemento tElementox) x) {{ ifif(*A (*A== ==NULL NULL)){{ *A *A==(tAB (tAB*) *)malloc(sizeof(tAB)); malloc(sizeof(tAB)); (*A (*A)->info )->info==x; x; (*A (*A)->izq )->izq==NULL; NULL; (*A (*A)->der )->der==NULL; NULL; }} else else if( if((*A) (*A)-> ->info info>>x) x) InsertarNodo(&(*A) InsertarNodo(&(*A)-> ->izq, izq,x); x); else else if( if((*A) (*A)-> ->info info<<x) x) InsertarNodo(&(*A) InsertarNodo(&(*A)-> ->der, der,x); x); else else printf( printf(“Dato “Datorepetido repetido “); “); }} 39 Universidad Técnica Federico Santa María - Departamento de Informática ABB – EliminarNodo 1. Buscar el nodo que se desea borrar. 2. Si se encuentra el nodo hay que contemplar tres casos posibles: a) Si el nodo a borrar no tiene hijos Î se libera el espacio que ocupa. b) Si el nodo a borrar tiene un hijo Î este hijo ocupa la posición ocupada por el nodo borrar. c) Si el nodo a borrar tiene dos hijos Î i. Se busca el máximo de la rama izquierda, o el mínimo de la rama derecha. ii. Se sustituye el nodo a borrar por el nodo encontrado (máximo o mínimo). iii. Se elimina el nodo copiado (máximo o mínimo). 40 Universidad Técnica Federico Santa María - Departamento de Informática El TAD ABB – EliminarNodo a) Que el nodo sea una hoja: 41 Universidad Técnica Federico Santa María - Departamento de Informática El TAD ABB – EliminarNodo b) Que el nodo tenga un hijo: 42 Universidad Técnica Federico Santa María - Departamento de Informática El TAD ABB – EliminarNodo c) Que el nodo sea interno: 43 Universidad Técnica Federico Santa María - Departamento de Informática ABB – EliminarNodo; caso a) Si el nodo a borrar no tiene hijos Î se libera el espacio que ocupa. Árbol Inicial: Árbol Final: 15 15 9 27 21 12 9 36 24 18 27 21 12 36 18 Suprimir 24 44 Universidad Técnica Federico Santa María - Departamento de Informática ABB – EliminarNodo; caso b) Si el nodo a borrar tiene un hijo Î este hijo ocupa la posición ocupada por el nodo borrar. Árbol Inicial: Árbol Final: 15 15 9 27 21 12 9 36 12 18 27 18 36 Suprimir 21 45 Universidad Técnica Federico Santa María - Departamento de Informática ABB – EliminarNodo; caso c) Si el nodo a borrar tiene dos hijos Î i. Se busca el máximo de la rama izquierda o el mínimo de la rama derecha. ii. Se sustituye el nodo a borrar por el nodo encontrado. Árbol Inicial: Árbol Final: Suprimir 15 15 12 9 9 27 18 12 27 18 36 36 46 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Para el árbol inicial, eliminar las claves 24 – 21 – 15 – 27 – 12. Suprimir 24 (caso a): Arbol inicial: 15 15 12 12 36 21 18 27 9 27 9 36 21 18 24 47 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Arbol inicial: Suprimir 21 (caso b): 15 15 27 9 27 9 12 21 36 12 18 36 18 48 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Árbol inicial: Suprimir 15 (caso c): 15 Dos soluciones posibles : 27 9 12 12 18 36 18 27 9 36 18 27 9 12 36 49 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Árbol inicial: Suprimir 27 (caso c): 12 12 27 9 18 9 36 36 18 50 Universidad Técnica Federico Santa María - Departamento de Informática ABB – Ejercicios Arbol inicial: Suprimir 12 (caso c): 12 9 9 18 18 36 36 51 Universidad Técnica Federico Santa María - Departamento de Informática Implementación de EliminarNodo void voideliminar eliminar(Nodo** (Nodo**r,r,TipoElemento TipoElementodato) dato) {{ ifif(!(*r)) (!(*r)) puts("Nodo puts("Nodono noencontrado"); encontrado"); else elseifif(dato (dato<<(*r) (*r)-> ->dato) dato) eliminar(&(*r) eliminar(&(*r)->izdo, ->izdo,dato); dato); else if (dato > (*r) ->dato) else if (dato > (*r) ->dato) eliminar(&(*r) ->dcho,dato); eliminar(&(*r) ->dcho,dato); else /*/*Nodo else {{ Nodoencontrado encontrado*/*/ Nodo* /*/*puntero Nodo*q;q; punteroalalnodo nodoaasuprimir suprimir*/*/ qq==(*r); /*/*rres (*r); eselelptr ptrdel delnodo nodoPadre Padre*/*/ ifif(q ->izdo == NULL) (q ->izdo == NULL) (*r) = q >dcho; (*r) = q >dcho; else elseifif(q (q->dcho ->dcho== ==NULL) NULL) (*r) (*r)==qq->izdo; ->izdo; else /*/*tiene else tienerama ramaizquierda izquierdayyderecha derecha*/*/ reemplazar(&q); reemplazar(&q); free(q); free(q); Autor: Ing Rolando Simon Titiosky }} 52 }} Universidad Técnica Federico Santa María - Departamento de Informática Implementación de EliminarNodo void voidreemplazar(Nodo** reemplazar(Nodo**act) act) {{ Nodo* Nodo*a,a,*p; *p; pp==*act; *act; aa==(*act) /*/*menores (*act)->izdo; ->izdo; menoresaaIZQ*/ IZQ*/ while while(a(a->dcho) ->dcho) {{ pp==a;a; /*/*buscar el Mayor buscar el MayoraaDER*/ DER*/ aa==aa->dcho; ->dcho; }} /*/*Cambio Cambiodel delcampo campoDatos Datos*/*/ (*act) (*act)->dato ->dato==aa->dato; ->dato; /*/*Al AlAbuelo Abuelop,p,se sehace hacecargo cargode denieto nietoIZQ IZQ*/*/ ifif(p (p== ==(*act)) (*act)) pp->izdo ->izdo==aa->izdo; ->izdo; else else pp->dcho ->dcho==aa->izdo; ->izdo; (*act) (*act)==a;a; }} 53 Universidad Técnica Federico Santa María - Departamento de Informática Otras Operaciones del TAD ABB • • • • • • • • • • • • • Altura: retorna la altura de un árbol Construir: crea un árbol con un elemento raíz y dos ramas. Copiar: crear una copia del árbol CrearArbol: Inicia un árbol vacío Derecho: retorna la rama derecha de un árbol dado. Nodos: determina el número de nodos del árbol EsVacio: comprueba si el árbol tiene nodos Iguales: determinar si dos árboles son idénticos Izquierdo: retorna la rama izquierda de un árbol dado. Pertenece: determina si un elemento pertenece a un árbol. Recorrer: el árbol de acuerdo a algunos de los criterios Profundidad: determina la profundidad de un árbol dado Raiz: devuelve el nodo raíz. 54 Universidad Técnica Federico Santa María - Departamento de Informática Análisis de la complejidad de un ABB Si el árbol está bien balanceado, ningún camino de la raíz a una hoja tiene más de ( 1 + log2(n) ) nodos. Ejemplo: 18 27 9 15 12 21 36 h(A) = ( 1 + log2(7) ) ≈ 3 55 Universidad Técnica Federico Santa María - Departamento de Informática Análisis de la complejidad de un ABB Pueden ocurrir situaciones muy desfavorables: 18 27 36 41 92 Así, insertar un elemento i-ésimo toma O(i) 56 Universidad Técnica Federico Santa María - Departamento de Informática Análisis de la complejidad de un ABB Luego, el proceso de n inserciones toma : ⎛ n ⎛ ⎛ n + 1⎞⎞⎞ O⎜⎜ i = O⎜⎜ n⎜ ⎟ ⎟⎟ ⎟⎟ ⎝ ⎝ 2 ⎠⎠⎠ ⎝ i =1 ∑ Se puede demostrar que el caso promedio en la inserción es : h(altura) = 1.4 log2(n); O(log2(n)) El caso promedio en hacer una operación Búsqueda, Eliminar, también lo son. 57 Universidad Técnica Federico Santa María - Departamento de Informática Ejercicios 1. Implementar una función que devuelva una lista con las hojas de un árbol binario de búsqueda. 2. Implementar una función que devuelva el nº de nodos externos de un árbol binario de búsqueda. 3. Escribir la función MAX_NODO que, suponiendo que el tipo base Elemento posee una relación de orden total, devuelva el mayor valor de los almacenados en un ABB. 4. Dado un árbol binario de búsqueda, hacer un función que devuelva la diferencia entre el mayor y el menor de los valores almacenados en dicho árbol. Hacerlo de forma no recursiva. 58 Universidad Técnica Federico Santa María - Departamento de Informática Ejercicios 5. Implementar un procedimiento al que se le pasan dos árboles binarios de búsqueda, y devuelve uno sólo, también binario de búsqueda, y que es el resultado de la mezcla de los dos anteriores. 6. Representar por medio de árboles las siguientes expresiones aritméticas: • (x + y) * (a- b) • [x + (y * z)] * c • x * (y / -z) • a + [(b * (c + d)] • [a * (x + y)] * c • x * y / [(a + b) * c] • (x * y / a) + (b * c) 59 Universidad Técnica Federico Santa María - Departamento de Informática Bibliografía - Webgrafía • Introduction to Algorithms, 2nd edition. Cormen, T., Leiserson, Ch., Rivest, R. and Stein, C. MIT Press. 2001. • Data Structures and Algorithms. A. Aho, J. Hopcroft, and J. Ullman. Addison-Wesley, 1983. Traducido al castellano, 1988. • The Art of Computer Programming. Vol. 3: Searching and Sorting. Donald E. Knuth. Addison-Wesley, Massachusetts, 1973. Traducido al castellano en Ed. Reverté, Barcelona. • Programación Modular. ETSIT. Guión del profesor Juan Falgueras, Curso 2005. • Estructuras de Datos y Algoritmos, M.A. Weiss, AddisonWesley Iberoamericana, 1995. • http://www.lcc.uma.es/~galvez/ftp/tad/tadtema4.pdf 60 Universidad Técnica Federico Santa María - Departamento de Informática Bibliografía - Webgrafía • http://delta.cs.cinvestav.mx/~adiaz/anadis/BinTree.pdf • http://www.ucema.edu.ar/~rst/Algoritmos_y_Estructura_de_Datos /Teoria/5._Arboles_binarios.pdf • http://www.madsgroup.org/docencia/alg/arboles_monticulos.pdf • http://www.fdi.ucm.es/profesor/csegura/edi0405/arboles.pdf • http://www.iuma.ulpgc.es/users/jmiranda/docencia/programacion/ Tema7_ne.pdf • http://quegrande.org/apuntes/EI/1/EDI/teoria/0809/arboles_binarios_de_busqueda.pdf • http://usuarios.multimania.es/sanjudas/download/ResumenArboles .pdf 61