ARBOLES ALGORITMO Y ESTRUCTURA DE DATOS Definición • Desde el punto de vista conceptual, un árbol es un objeto que comienza con una raíz (root) y se extiende en varias ramificaciones o líneas (edges), cada una de las cuales puede extenderse en ramificaciones hasta terminar, finalmente en una hoja. • Los árboles representan las estructuras no-lineales y dinámicas de datos más importantes en computación. Dinámicas, puesto que la estructura árbol puede cambiar durante la ejecución de un programa. No- lineales, puesto que a cada elemento del árbol pueden seguirle varios elementos. Propiedades En la ciencia de la computación definimos un árbol como un conjunto de nodos y líneas. Un nodo es un elemento de información que reside en el árbol. Una línea es un par de nodos ordenados <u,v>, y a la secuencia de líneas se le denomina ruta (path). Los árboles tienen las siguientes propiedades: • Tienen un nodo al que se le llama raíz del árbol. • Todos los nodos, excepto la raíz, tienen una sola línea de entrada (el nodo raíz no tiene ninguna). • Existe una ruta única del nodo raíz a todos los demás nodos del árbol. • Si hay una ruta <a,b>, entonces a „b‟ se le denomina „hijo‟ de „a‟ y es el nodo raíz de un subárbol. LONGITUD DE CAMINO INTERNO Y EXTERNO. Se define la longitud de camino X como el número de arcos que deben ser recorridos para llegar desde la raíz al nodo X. Por definición la raíz tiene longitud de camino 1, sus descendientes directos longitud de camino 2 y así sucesivamente. Longitud de Camino Interno • La longitud de camino interno es la suma de las longitudes de camino de todos los nodos del árbol. Es importante por que permite conocer los caminos que tiene el árbol. Puede calcularse por medio de la siguiente fórmula: ℎ 𝐿𝐶𝐼 = • donde 𝑛𝑖 ∗ 𝑖 𝑖=1 • “i” representa el nivel del árbol, • “h‟ su altura y • “ni‟ el número de nodos en el nivel “i‟. Media de la Longitud de Camino Interno (LCIM) • Se calcula dividiendo la LCI entre el número de nodos del árbol (n). LCIM = LCI / n • Y significa el número de arcos que deben ser recorridos en promedio para llegar, partiendo de la raíz, a un nodo cualquiera del árbol. • La LCIM del árbol anterior es: LCIM = 36 / 12 = 3 ARBOLES BINARIOS Definición • Un árbol ordenado es aquel en el cual la distribución de las ramas sigue cierto orden. Los árboles ordenados de grado 2 son de especial interés puesto que representan una de las estructuras de datos más importante en computación, conocida como árboles binarios. • En un árbol binario cada nodo puede tener como máximo dos subárboles; y siempre es necesario distinguir entre el subárbol izquierdo y el subárbol derecho Árbol Binario de Búsqueda Representación de una Expresión Algebraica Árbol Binario Tipos de Arboles Tipos de Arboles Los arboles pueden clasificarse tomando en cuenta su estructura y funcionamiento. A continuación, se presentan los tipos de árboles más utilizados (Cairó & Guardati, 2006): Arboles binarios. • Arboles binarios distintos • Arboles binarios similares • Arboles binarios equivalentes • Arboles binarios completos • Arboles binarios llenos • Arboles binarios degenerados • Arboles binarios de búsqueda • Arboles equilibrados Arboles multicaminos • Arboles-B • Arboles B+ • Arboles 2-4 Arboles Binarios Esta estructura se caracteriza por que cada nodo solo puede tener máximo 2 hijos, dicho de otra manera, es un árbol grado dos. Árboles binarios distintos, similares y equivalentes • Árboles binarios distintos. Dos árboles binarios son distintos cuando sus estructuras son diferentes. • Árboles binarios similares. Dos árboles binarios son similares cuando sus estructuras son idénticas, pero la información que contienen sus nodos difiere entre sí. • Árboles binarios equivalentes. Los árboles binarios equivalentes se definen como aquellos que son similares y además los nodos contienen la misma información. Arboles distintos Arboles similares A B A C D B C A B D A P C D Arboles equivalentes Q R S B A C D B C D Árboles binarios completos • Un árbol binario completo de profundidad n es un árbol en el que, para cada nivel, del 0 al nivel n-1 tiene un conjunto lleno de nodos y todos los nodos hoja a nivel n ocupan las posiciones más a la izquierda del árbol Árbol binario completo Árbol binario completo A B Árbol binario completo A A B C D Árbol binario NO completo Facultad de B A C D tica E F Árbol binario NO completo A B C E D Árbol binario NO completo A B C C B F rm tica E F Árboles binarios llenos • Es un árbol lleno donde todos los nodos tienen cero o dos hijos. Es decir, no existe un nodo que tenga un solo hijo. Árbol binario lleno Árbol binario lleno A B Árbol binario lleno A B C D Árbol binario NO lleno A C E E D A A B B E C B C D G F Árbol binario NO lleno Árbol binario NO lleno A C B F Facultad de Estadístic a Informátic e a D E F Árboles binarios degenerados • Es un tipo especial denominado árbol degenerado en el que hay un solo nodo hoja y cada nodo no hoja sólo tiene un hijo. Un árbol degenerado es equivalente a una lista enlazada. Lista enlazada Árbol binario degenerado A A BB C D E B C D E Árboles binarios equilibrados • Cuando un árbol binario de búsqueda crece descontroladamente hacia un extremo su rendimiento puede disminuir considerablemente. Para mantener la eficiencia de operación surgen los árboles equilibrados o balanceados. Estos pueden realizar acomodos o balanceos después de inserciones o eliminaciones de elementos. Árbol binario no equilibrado Árbol binario equilibrado AVL 15 15 12 12 18 30 29 10 7 13 Árbol binario perfectamente equilibrado 15 12 0 2 18 22 11 Facultad de Estadística e Informática 10 13 0 2 18 22 Arboles binarios perfectamente equilibrados Un árbol perfectamente equilibrado es un árbol binario en el que, para todo nodo, el número de nodos en el subárbol izquierdo y el número de nodos en el subárbol derecho difieren como mucho en una unidad. Árbol binario no equilibrado Árbol binario equilibrado AVL 15 15 12 12 18 30 29 10 7 13 Árbol binario perfectamente equilibrado 15 12 0 2 18 22 11 Facultad de Estadística e Informática 10 13 0 2 18 22 Arboles binarios equilibrados AVL • Un árbol equilibrado en sentido AVL (Adelson-Velskii y Landis, 1962) es un árbol binario en el que la diferencia de alturas de los subárboles izquierdo y derecho correspondientes a cualquier nodo del árbol no es superior a uno. Árbol binario no equilibrado Árbol binario equilibrado AVL 15 15 12 12 18 30 29 10 7 13 Árbol binario perfectamente equilibrado 15 12 0 2 18 22 11 Facultad de Estadística e Informática 10 13 0 2 18 22 Arboles multicaminos • Un árbol multicaminos es una estructura de datos homogénea, dinámica y no lineal, en donde a cada nodo le pueden seguir una cantidad n de nodos hijos... • Mientras que los árboles binarios fueron pensados para trabajar en memoria principal, los arboles multicaminos fueron diseñados para trabajar con sistemas de archivos (Serrano Montero, 2006). Árbol multicaminos 15 12 30 29 04 18 36 31 37 56 58 Árboles binarios de búsqueda Árboles binarios de búsqueda Un árbol binario que tiene los nodos ordenados de alguna manera se conoce como árbol binario de búsqueda. Se puede buscar aplicando el criterio de búsqueda binaria similar al utilizado con arreglos. En concreto, un árbol binario de búsqueda es aquel en que, dado un nodo, todos los datos del subárbol izquierdo son menores que los datos de ese nodo, mientras que todos los datos del subárbol derecho son mayores que el nodo. Árbol binario de búsqueda 55 30 41 4 2 5 75 7 85 Árboles binarios de búsqueda Formalmente se define un árbol binario de búsqueda de la siguiente manera (Cairó & Guardati, 2006): • Para todo nodo T del árbol se debe cumplir que todos los valores almacenados en el subárbol izquierdo de T sean menores a la información guardada en el nodo T. De forma similar, todos los valores almacenados en el subárbol derecho de T deben ser mayores a la información guardada en el nodo T. Árbol binario de búsqueda 55 30 41 4 2 5 757 85 Ventajas de los árboles binarios de búsqueda En un arreglo es posible localizar datos eficientemente si estos se encuentran ordenados, pero las operaciones de inserción y eliminación resultan costosas, porque involucran movimiento de los elementos dentro del arreglo. En las listas, por otra parte, dichas operaciones se pueden llevar a cabo con facilidad, pero la operación de búsqueda, en este caso, es una operación que demanda recursos, pudiendo inclusive requerir recorrer todos los elementos de ella para llegar a uno en particular. Creación de un árbol binario de búsqueda • Graficar un árbol binario con los siguientes datos: 9, 2, 1, 16, 6, 11, 8, 4 9 9 Árboles binarios de búsqueda Implementación El nodo raíz (nodo B) es el primer nodo en un árbol. Cada enlace en el nodo raíz hace referencia a un hijo (nodos A y D). El hijo izquierdo (nodo A) es el nodo raíz del subárbol izquierdo (que sólo contiene el nodo A), y el hijo derecho (nodo D) es el nodo raíz del subárbol derecho (que contiene los nodos D y C). Árboles binarios de búsqueda Implementación esVacio() Constructor Destructor [1] Insertar elemento [2] Mostrar árbol completo acostado con la raíz a la izquierda [3] Graficar árbol completo [4] Buscar un elemento en el árbol [5] Recorrer el árbol en PreOrden [6] Recorrer el árbol en InOrden [7] Recorrer el árbol en PostOrden [8] Eliminar un nodo del árbol PREDECESOR [9] Eliminar un nodo del árbol SUCESOR [10] Recorrer el árbol por niveles (Amplitud) [11] Altura del árbol [12] Cantidad de hojas del árbol [13] Cantidad de nodos del árbol [15] Revisa si es un árbol binario completo [16] Revisa si es un árbol binario lleno [17] Eliminar el árbol Árboles binarios de búsqueda. Implementación • La Clase Nodo • Crea un Nodo formado por los campos • Dato (de tipo entero) corresponde al valor que contiene el nodo • Nodo*izquierdoPtr • Nodo*derechoPtr izq dato der Árboles binarios de búsqueda. Implementación • Clase Árbol • Crea un Nodo raíz del árbol raizPtr Árboles binarios de búsqueda. Implementación o Método Constructor Arbol::Arbol() o Inicializa la raíz del Árbol con valor Nulo. raizPtr NULL Árboles binarios de búsqueda. Implementación o Método Destructor Arbol::~Arbol() o Libera la memoria ocupada por los nodos del árbol. o Emplea el método Arbol::podarArbol(Nodo *&nodoPtr) Árboles binarios de búsqueda. Implementación o Método Arbol::esVacio() o Verifica si la raíz del árbol apunta a vacío. Árboles binarios de búsqueda. Implementación o Método Nodo *Arbol::regresaRaiz() o Regresa el nodo de la raíz del árbol. Árboles binarios de búsqueda. Implementación o Método void Arbol::insertarNodo(int valor, Nodo *&nodoPtr) o Crea un nuevo nodo y lo inserta en el lugar correspondiente dentro del árbol. Árboles binarios de búsqueda. Implementación o Método void Arbol::insertarNodo(int valor, Nodo *&nodoPtr) o Valor=4 Facultad de Estadística e Inf Llamada a Arbol::insertarNodo en el menú principal, donde podemos observar los parámetros que se le envían: raizPtr Árboles binarios de búsqueda. Implementación o Método void Arbol::insertarNodo(int valor, Nodo *&nodoPtr) o Valor=4 izquieroPtr dato derechoPtr 8 3 20 1 NULL NULL NULL NULL 10 5 NULL NULL 7 NULL NULL Primera iteración de la recursión: nodoPtr = raizPtr (nodoPtr no es nulo) 4<8 insertarNodo (4, nodoPtr→izquierdoPtr) Se llama nuevamente el método insertar Nodo con el valor 4 a insertar y la dirección del nodo que contiene el número 3 (a la izquierda del 8). raizPtr Árboles binarios de búsqueda. Implementación o Método void Arbol::insertarNodo(int valor, Nodo *&nodoPtr) o Valor=4 izquieroPtr dato derechoPtr 8 3 20 1 NULL NULL NULL NULL 10 5 NULL NULL 7 NULL NULL Segunda iteración de la recursión: nodoPtr = nodo con el dato 3 (nodoPtr no es nulo) 4>3 insertarNodo (4, nodoPtr→derechoPtr) Se llama nuevamente el método insertar Nodo con el valor 4 a insertar y la dirección del nodo que contiene el número 5 (a la derecha del 3). raizPtr Árboles binarios de búsqueda. Implementación o Método void Arbol::insertarNodo(int valor, Nodo *&nodoPtr) o Valor=4 izquieroPtr dato derechoPtr 8 3 20 1 NULL NULL NULL NULL 10 5 NULL NULL 7 NULL NULL Tercera iteración de la recursión: nodoPtr = nodo con el dato 5 (nodoPtr no es nulo) 4<5 insertarNodo (4, nodoPtr→izquierdoPtr) Se llama nuevamente el método insertar Nodo con el valor 4 a insertar y la dirección del nodo a la izquierda de 5, es decir NULL. raizPtr Árboles binarios de búsqueda. Implementación o Método void Arbol::insertarNodo(int valor, Nodo *&nodoPtr) o Valor=4 izquieroPtr dato derechoPtr 8 3 20 1 NULL NULL NULL NULL 10 5 NULL NULL 7 NULL NULL Cuarta iteración de la recursión: nodoPtr = NULL Por lo tanto ingresa al if (nodoPtr==NULL) y crea un nuevo nodoPtr: 4 NULL NULL raizPtr Árboles binarios de búsqueda. Implementación o Método void Arbol::insertarNodo(int valor, Nodo *&nodoPtr) o Valor=4 izquieroPtr dato derechoPtr 8 3 NULL NULL NULL 7 4 NULL NULL 10 5 1 NULL 20 NULL NULL NULL Cuarta iteración de la recursión: nodoPtr contiene el nuevo nodo creado a la izquierda del nodo con el dato 5. Árboles binarios de búsqueda. Implementación o Método Arbol::muestraAcostado(int nivel, Nodo *nodoPtr) 20 10 raizPtr 8 7 o Escribe en pantalla el árbol en forma horizontal, con la raíz a la izquierda. 5 4 3 1 Árboles binarios de búsqueda. Implementación o Método Arbol::muestraAcostado(int nivel, Nodo *nodoPtr) o Escribe en pantalla el árbol en forma horizontal, con la raíz a la izquierda. Árboles binarios de búsqueda. Implementación o Método Arbol::muestraAcostado(int nivel, Nodo *nodoPtr) Llamada a Arbol::muestraAcostado en el menú principal, donde podemos observar los parámetros que se le envían: Recorrido en InOrden (izquierdo, raíz, derecho). El valor en un nodo no se procesa hasta que se procesen los valores en su subárbol izquierdo. Para recorrer un árbol binario no vacío en InOrden, hay que realizar las siguientes operaciones recursivamente en cada nodo, comenzando con el nodo raíz: Recorrer el subárbol izquierdo InOrden Procesa la raíz Recorrer el subárbol derecho InOrden imprime los valores en orden ascendente. Secuencia: 6 – 13 – 17 – 27 – 33 – 42 - 48 Recorrido en InOrden (izquierdo, raíz, derecho). El valor en un nodo no se procesa hasta que se procesen los valores en su subárbol izquierdo. Para recorrer un árbol binario no vacío en InOrden, hay que realizar las siguientes operaciones recursivamente en cada nodo, comenzando con el nodo raíz: 8 Recorrer el subárbol izquierdo InOrden Procesa la raíz 3 0 2 5 1 10 Recorrer el subárbol derecho InOrden 4 imprime los valores del nodo en orden ascendente. 7 Secuencia: 1 – 3 – 4 – 5 – 7 – 8 – 10 – 20 Recorrido en InOrden (izquierdo, raíz, derecho) Llamada en main: Recorrido en PreOrden (raíz, izquierdo, derecho). Para recorrer un árbol binario no vacío en PreOrden, hay que realizar las siguientes operaciones recursivamente en cada nodo, comenzando con el nodo raíz: Procesa la raíz Recorrer el subárbol izquierdo en PreOrden Recorrer el subárbol derecho en PreOrdenda Secuencia: 27 – 13 – 6 – 17 – 42 – 33 - 48 Recorrido en PreOrden Recorrido en PreOrden (raíz, izquierdo, derecho) Recorrido en PostOrden (izquierdo, derecho, raíz). Para recorrer un árbol binario no vacío en PostOrden, hay que realizar las siguientes operaciones recursivamente en cada nodo, comenzando con el nodo raíz: Recorrer el subárbol izquierdo en PostOrden Recorrer el subárbol derecho en PostOrden Procesa la raíz Recorrido en PostOrden Recorrido en PostOrden (izquierdo, derecho, raíz) Árboles binarios de búsqueda. Implementación • Escribe la secuencia de elementos del siguiente árbol recorriéndolo en: inOrden, preOrden y postOrden. Solución: InOrden: 7, 9, 10, 12, 15, 25, 30, 35. PreOrden: 12, 9, 7, 10, 25, 15, 30, 35. PostOrden: 7, 10, 9, 15, 35, 30, 2 Árboles binarios de búsqueda. Implementación • Recorrido en PostOrden del siguiente árbol: Árboles binarios de búsqueda. Implementación o Método Arbol::busqueda(int x, Nodo *nodoPtr). o Es el método para buscar un valor x de manera recursiva, en el campo dato de los nodos de un árbol. Árboles binarios de búsqueda. Implementación o Con valores iniciales se tienen el valor a buscar y la raíz del arbol : Árboles binarios de búsqueda. Implementación o Actividad: o Por lo tanto: 1. nodoPtr toma como valor inicial, al ingresar al método, la raíz del árbol. Si el valor de x es mayor a la raíz, se realiza el paso recursivo con el lado derecho. Si el valor de x es menor se realiza el paso recursivo con el lado izquierdo. 2. Si x no es mayor ni menor, significa que se ha encontrado el nodo con el valor de x y regresará True. 3. Si se llegó a un nodo Nulo, se retorna False. Árboles binarios de búsqueda. Implementación o Método Arbol::busqueda(int x, Nodo *nodoPtr) o Busca el valor de “x” en los nodos del árbol. Árboles binarios de búsqueda. Implementación o void Arbol::podarArbol(Nodo *&nodoPtr) o Libera memoria de los nodos del árbol. Arboles AVL Problema de los árboles binarios de búsqueda • Los árboles binarios, son eficientes en las operaciones de búsqueda, inserción y eliminación cuando el árbol crece o decrece descontroladamente, la eficiencia de la estructura de datos decae. Insertar los datos 15,18,30,60 Insertar los datos 32,11,9,4, Se expanden incrementando las comparaciones, operación de O(N) 15 18 Mas Critico cuando el árbol crece ordenadamente 30 32 11 9 60 4 Variantes de los árboles binarios de búsqueda • Con el objetivo de mantener la eficiencia en la operación de búsqueda surgen modificaciones a las reglas de operación del árbol binario de búsqueda. • Surge el Árbol Balanceado (AVL) • Estas variantes presentan ventajas en cuanto al rendimiento que ofrecen a la hora de realizar búsquedas principalmente. Árbol balanceado AVL • La principal característica de estos es la de realizar reacomodos o balanceos, después de inserciones o eliminaciones de elementos. • Estos árboles también reciben el nombre de AVL (autores: 2 matemáticos rusos G.M. Adelson-Velskii y E.M Landis en 1962). • Formalmente se define un árbol balanceado como un árbol de búsqueda, en el cual se debe cumplir la siguiente condición: “Para todo nodo T del árbol la altura de los subárboles izquierdo y derecho no deben diferir en a lo sumo una unidad”. Definición • Básicamente un árbol AVL es un Árbol Binario de Búsqueda al que se le añade una condición de equilibrio. “Para todo nodo la altura de sus subárboles izquierdo y derecho pueden diferir a lo sumo en 1”. • Gracias a esta forma de equilibrio (o balanceo), la complejidad de una búsqueda en uno de estos árboles se mantiene siempre en orden de complejidad O(log n). Condición de equilibrio “Para todos los nodos, la altura de la rama izquierda no difiere en mas de una unidad de la altura de la rama derecha” Características • Un AVL es un ABB. • La diferencia entre las alturas de los subárboles. derecho e izquierdo no debe excederse en más de 1. • Cada nodo tiene asignado un peso de acuerdo a las alturas de sus subárboles. • Un nodo tiene un peso de 1 si su subárbol derecho es más alto, -1 si su subárbol izquierdo es más alto y 0 si las alturas son las mismas. Equilibrio Factor Equilibrio = (altura derecha )– (altura izquierda) Describe relatividad entre subárbol derecho y subárbol izquierdo. • + (positivo) → derecha mas alto (profundo) • - (negativo) → izquierda mas alto (profundo) “Un árbol binario es un AVL si y sólo si cada uno de sus nodos tiene un equilibrio de –1, 0, + 1” • Si alguno de los pesos de los nodos se modifica en un valor no válido (2 ó -2) debe seguirse un esquema de rotación. Desequilibrios • Desequilibrio hacia la izquierda (Equilibrio > +1) • Desequilibrio hacia la derecha (Equilibrio < -1) Operaciones sobre un AVL 1. Inserta nodo 2. Balancear • Rotación Simple a la Derecha (RSD): Se tiene un factor de equilibrio de -2 y su nodo izquierdo no tiene un factor de equilibrio de 1. • Rotación Simple a la Izquierda (RSI): Se tiene un factor de equilibrio de 2 y su nodo derecho no tiene un factor de equilibrio de -1. • Rotación Doble a la Izquierda (RDI): Se tiene un factor de equilibrio de 2 y su nodo derecho tiene un factor de equilibrio de -1. • Rotación Doble a la Derecha (RDD): Se tiene un factor de equilibrio de -2 y su nodo izquierdo tiene un factor de equilibrio de 1. 3. Eliminar todo 4. Calcular altura Insertar un nodo 1. Se usa la misma técnica que para insertar un nodo en un ABB ordenado 2. Trazamos una ruta desde el nodo raíz hasta un nodo hoja (donde hacemos la inserción). 3. Insertamos el nodo 4. Volvemos a trazar la ruta de regreso al nodo raíz, ajustando el equilibrio a lo largo de ella. nuevo. 5. Si el equilibrio de un nodo llega a ser + - 2, volvemos a ajustar los subárboles de los nodos para que su equilibrio se mantenga acorde con los lineamientos AVL (que son +- 1) Balancear • Caso 1: Rotación simple izquierda RSI: Si esta desequilibrado a la izquierda (E>+1) y su hijo derecho tiene el mismo signo (+) hacemos rotación sencilla izquierda. • Caso 2: Rotación simple derecha RSD: Si esta desequilibrado a la derecha (E<-1) y su hijo izquierdo tiene el mismo signo (-) hacemos rotación sencilla derecha. • Caso 2: Rotación simple derecha RSD -1 0 D D Rotación simple izquierda o derecha. Observaciones: • Se conserva el orden apropiado del árbol. • Restablece todos los nodo a equilibrios apropiados AVL • Conserva el recorrido en orden que el árbol anterior. • Sólo se necesita a lo más modificar 3 apuntadores para lograr el nuevo equilibrio (con la de la raíz) • Caso 3: Rotación doble izquierda RDI: Si está desequilibrado a la derecha (E< –1), y su hijo izquierdo tiene distinto signo (+) hacemos rotación doble izquierda-derecha. • Caso 3: Rotación doble izquierda RDI • Caso 4: Rotación doble derecha RDD: Si esta desequilibrado a la izquierda (E>+1), y su hijo derecho tiene distinto signo (–) hacemos rotación doble derecha-izquierda. • Caso 4: Rotación doble derecha RDD Eliminar • Al eliminar un nodo en un árbol AVL puede afectar el equilibrio de sus nodos. Entonces hay que hacer rotaciones simples o dobles. • Eliminar un nodo se realiza de la misma manera que en un árbol binario ordenado. Al localizar el nodo que se desea eliminar se realiza el siguiente procedimiento: • Si el nodo es un nodo hoja, simplemente lo eliminamos. • Si el nodo solo tiene un hijo, lo sustituimos con su hijo. • Si el nodo eliminado tiene dos hijos, lo sustituimos por el nodo que se encuentra mas a la derecha en el subárbol izquierdo o más a la izquierda en el subárbol derecho. Una vez que se ha eliminado el nodo, se tiene que equilibrar el árbol: • Si el equilibrio del padre del nodo eliminado cambia de 0 a +-1 el algoritmo concluye. • Si el padre del nodo eliminado cambio de +-1 a 0, la altura del árbol ha cambiado y se afecta el equilibrio de su abuelo. • Si el equilibrio del padre del nodo eliminado cambia de +- 1 a +- 2 hay que hacer una rotación. Después de concluirla, el equilibrio del padre podría cambiar, lo que, a su vez, podría forzarnos a hacer otros cambios (y probables rotaciones) en toda la ruta hacia arriba a medida que ascendemos hacia la raíz. Si encontramos en la ruta un nodo que cambie de 0 a +- 1 entonces se concluye. Inserción • Ejemplos de Rotación Simple • Rotaciones Dobles Eliminar • Eliminar (32) Complejidad de búsqueda • Los árboles AVL están siempre equilibrados de tal modo que para todos los nodos, la altura de la rama izquierda no difiere en mas de una unidad de la altura de la rama derecha. Gracias a esta forma de equilibrio (o balanceo), la complejidad de una búsqueda en uno de estos arboles se mantiene siempre en orden de complejidad O(log2n). Orden de complejidad O(f(n)) N=100 N=200 En un t=2h (N=?) log n 1h 1.15 h 10000 n 1h 2h 200 n log n 1h 2.30 h 199 n2 1h 4h 141 n3 1h 8h 126 2n 1h 1030 h 101 Arboles B+ Definición • Los árboles B+ son una variante de los árboles B, se diferencian en que los arboles B+ toda la información se encuentra almacenada en las hojas. En la raíz y en las páginas internas se encuentran almacenado índices o claves para llegar a un dato. Características de los árboles B+ • La raíz almacena como mínimo un dato y como máximo m-1 datos. • La página raíz tiene como mínimo dos descendientes. • Las páginas intermedias tienen como mínimo (m-1)/2(Parte entera) datos. • Las páginas intermedias tienen como máximo m-1 datos. • Todas las paginas hojas tienen la misma altura • La informacion se encuentra ordenada. • Toda la informacion se encuentra almacenada en las páginas hoja, por lo que en las páginas internas se puede duplicar las claves. Ejemplo • Ejemplo de un árbol B+ de orden 5: Inserción en un árbol B+: 1. Se ubica en la página raíz. 2. Se evalúa si es una página hoja. • Si la respuesta es afirmativa, se evalúa si no sobrepasa los limites de datos. • Si la respuesta es afirmativa, entonces se procede a insertar el nuevo valor en lugar del correspondiente. • Si la respuesta es negativa, se divide la página en dos, se sube una copia de la mediana a la página padre, si la página padre se encuentra llena se debe de partir igual y así el mismo proceso hasta donde sea necesario, si este proceso llega hasta la raíz la altura del árbol aumenta en uno. • Si no es hoja, se compara el elemento a insertar con cada uno de los valores almacenados para encontrar la página descendiente donde proseguir la búsqueda. Se regresa al paso 1. Ejemplo • Insertar las siguientes claves a un árbol de orden 5: 10-27-29-17-2521-15-31-13-51-20-24-48-19-60-35-66 Eliminación La operación de eliminación en árboles-B+ es más simple que en árboles-B. Esto ocurre porque las claves a eliminar siempre se encuentran en las páginas hojas. En general deben distinguirse los siguientes casos: 1.Si al eliminar una clave, la cantidad de llaves queda mayor o igual que [m/2] entonces termina la operación. Las claves de los nodos raíz o internos no se modifican por más que sean una copia de la clave eliminada en las hojas. 2.Si al eliminar una clave, la cantidad de llaves queda menor que [m/2] entonces debe realizarse una redistribución de claves, tanto en el índice como en las paginas hojas. Arboles Rojos - Negros Definición Un árbol rojo-negro es un árbol binario de búsqueda equilibrado, una estructura de datos utilizada en informática y ciencias de la computación. La estructura original fue creada por Rudolf Bayer en 1972, que le dio el nombre de “árboles-B binarios simétricos”, pero tomó su nombre moderno en un trabajo deLeo J. Guibas y Robert Sedgewick realizado en 1978. Es complejo, pero tiene un buen peor caso de tiempo de ejecución para sus operaciones y es eficiente en la práctica. Puede buscar, insertar y borrar en un tiempo O(log n), donde n es el número de elementos del árbol Eficiencia 1. En primer lugar, el árbol rojo-negro no cumple la condición de equilibrio del árbol AVL, es decir, el árbol de búsqueda binario en el que la altura de los subárboles izquierdo y derecho de cada nodo es como máximo 1 diferente. Sin embargo, se propone agregar color al nodo. El árbol rojo-negro es usar un equilibrio no estricto para reducir el número de rotaciones al agregar y eliminar nodos. Cualquier desequilibrio se resolverá en tres rotaciones, y AVL es un árbol estrictamente equilibrado, por lo que se agrega o elimina. En el momento del nodo, según diferentes situaciones, el número de rotaciones es mayor que el del árbol rojo-negro. Entonces la eficiencia de inserción del árbol rojo-negro es mayor 2. El árbol rojo-negro puede buscar, insertar y eliminar operaciones con complejidad de tiempo O (log2 (n)) 3. En términos simples, el árbol rojo-negro es para resolver los defectos del árbol de búsqueda binario, porque el árbol de búsqueda binario se degenerará en una estructura lineal en algunos casos. Comparación y selección de árboles rojonegros y árboles equilibrados. 1. La estructura de árbol equilibrada es más intuitiva y el rendimiento de lectura es mayor que el del árbol rojo-negro; el rendimiento de agregar y eliminar nodos para restaurar el equilibrio no es tan bueno como el árbol rojo-negro 2. Árboles rojo-negros, el rendimiento de lectura no es tan bueno como el de los árboles balanceados; agregar y eliminar nodos restaura el rendimiento balanceado mejor que los árboles balanceados Claves duplicadas en un árbol de búsqueda, las claves duplicas no representan ningún problema y por tanto son permitidas. En un arbol rojo negro, las claves duplicadas representan un problema al momento de insertar/eliminar nodos. Por lo tanto, en un árbol rojo negro no permitimos la existencia de claves duplicadas. Propiedades de arboles rojos negros Los colores son utilizados para acotar las estructuras permitidas. En particular, en un árbol rojo negro el camino mas largo puede ser a lo sumo 2 veces mas largo que el camino mas corto. Las propiedades que definen a los arboles rojo y negro son: 1. Cada nodo es negro o rojo. 2. El nodo raíz es negro. 3. Cada nodo hoja (NIL O NULL) es negro. (refiere a un nodo hoja que está vacío) 4. Si un nodo es rojo, sus nodos secundarios deben ser negros. 5. Todas las rutas desde un nodo a sus descendientes contienen el mismo número de nodos negros. Altura negra Definimos la altura negra de un nodo x, denotada por bh(x), como el numero de nodos negros, sin incluir x, en un camino simple desde x hasta las hojas. Por la propiedad 5 la altura negra es bien definida. Altura Negra • Un árbol rojo negro con n claves (nodos internos) tiene altura h menor o igual a 2 log2(n+1)