Estructura de Datos [Árboles] M. en C. Sergio Luis Pérez Pérez UAM C UAJIMALPA , M ÉXICO, D. F. Trimestre 14-O Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 1 / 18 Árboles binarios Árboles binarios 1 Árboles binarios 2 Árboles binarios de búsqueda 3 Árboles balanceados Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 2 / 18 Árboles binarios Árboles binarios I Pendiente. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 3 / 18 Árboles binarios de búsqueda Árboles binarios de búsqueda 1 Árboles binarios 2 Árboles binarios de búsqueda 3 Árboles balanceados Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 4 / 18 Árboles binarios de búsqueda Árboles binarios de búsqueda I Pendiente. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 5 / 18 Árboles balanceados Árboles balanceados 1 Árboles binarios 2 Árboles binarios de búsqueda 3 Árboles balanceados Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 6 / 18 Árboles balanceados Árboles balanceados I Los árboles balanceados son un tipo de estructura no lineal que permite mejorar el acceso a la información. Dicha estructura se compone esencialmente de una llave y más de un apuntador a otras estructuras del mismo tipo. Todo elemento debe ser comparable sobre dicha llave. Cuando se realiza una búsqueda la idea es poder ir descartando en cada paso la mitad de la información que no sea de interés para dicha consulta. Los tipos de árboles balanceados más comunes son: Árboles AVL. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 7 / 18 Árboles balanceados Árboles balanceados II Árboles 2-3. Árboles rojinegros. Árboles B. Árboles B+. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 8 / 18 Árboles balanceados Árboles AVL Árboles AVL 1 Árboles binarios 2 Árboles binarios de búsqueda 3 Árboles balanceados Árboles AVL Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 9 / 18 Árboles balanceados Árboles AVL Árboles AVL I Es un tipo de árbol binario bien balanceado creado por los matemáticos rusos Georgi Adelsón-Velski y Yevgeni Mijáilovich Landis. La profundidad del árbol se encuentra en O(log n). Por lo tanto, permiten inserciones y borrados en tiempo O(log n). Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 10 / 18 Árboles balanceados Árboles AVL Árboles AVL II Propiedades de los árboles AVL Es un árbol balanceado. En cualquier nodo las alturas de sus hijos sólo pueden diferir en uno. Los nodos vacı́os o nulos tienen una altura de -1. Las hojas tienen altura cero. Los nodos se encuentran ordenados por una llave. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 11 / 18 Árboles balanceados Árboles AVL Árboles AVL III Estructura de datos en C++ struct avl{ avl *izq, *der; int altura, llave; TipoDato valor; void Insertar(avl*& raiz, int llave, TipoDato &Valor); void Borrar(avl*& raiz, int llave); void RotacionSimpleIzquierda(avl*& raiz); void RotacionSimpleDerecha(avl*& raiz); void RotacionDobleIzquierda(avl*& raiz); void RotacionDobleDerecha(avl*& raiz); void Balancea(avl*& raiz); void AjustaAltura(avl*& raiz); } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 12 / 18 Árboles balanceados Árboles AVL Árboles AVL IV Crear nodo CrarNodo(avl*& raiz, int llave, TipoDato valor){ raiz = new avl; raiz− >llave = llave; raiz− >valor = valor; raiz− >izq = raiz− >der = NULL; raiz− >altura = -1; } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 13 / 18 Árboles balanceados Árboles AVL Árboles AVL V Insertar Insertar(avl*& raiz, int llave, TipoDato &valor){ si (raiz == NULL) entonces CrearNodo(raiz, llave, valor); si (raiz− >llave == llave) entonces “Llave duplicada”; si (raiz− >llave < llave) entonces Insertar(raiz− >der, llave, valor); en otro caso Insertar(raiz− >izq, llave, valor); Balancea(raiz); } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 14 / 18 Árboles balanceados Árboles AVL Árboles AVL VI Rotación simple izquierda RotacionSimpleIzquierda(avl*& raiz){ avl *aux = raiz; raiz = aux− >izq; aux− >izq = raiz− >der; raiz− >der = aux; AjustaAltura(raiz− >der); AjustaAltura(raiz); } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 15 / 18 Árboles balanceados Árboles AVL Árboles AVL VII Altura int Altura(avl* raiz){ return raiz == NULL ? −1 : raiz− >altura; } Ajusta altura AjustaAltura(avl*& raiz){ raiz− >altura = max(Altura(raiz− >izq), Altura(raiz− >der))+1; } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 16 / 18 Árboles balanceados Árboles AVL Árboles AVL VIII Rotación doble izquierda RotacionDobleIzquierda(avl*& raiz){ RotacionSimpleDerecha(raiz− >izq); RotacionSimpleIzquierda(raiz); } Rotación doble derecha RotacionDobleDerecha(avl*& raiz){ RotacionSimpleIzquierda(raiz− >der); RotacionSimpleDerecha(raiz); } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 17 / 18 Árboles balanceados Árboles AVL Árboles AVL IX Balancea Balancea(avl*& raiz){ int dif = Altura(raiz− >izq)−Altura(raiz− >der); si dif == 2 entonces si Altura(raiz− >izq− >izq) > Altura(raiz− >izq− >der) entonces RotacionSimpleIzq(raiz); en caso contrario RotacionDobleIzq(raiz); si dif == −2 entonces si Altura(raiz− >der− >der) > Altura(raiz− >der− >izq) entonces RotacionSimpleDer(raiz); en caso contrario RotacionDobleDer(raiz); AjustaAltura(raiz);} Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Estructura de Datos 18 / 18