Guía didáctica: Estructura de Datos y Algoritmos II
SOLUCIONARIO ANEXOS
ANEXOS El presente material ha sido reproducido con nes netamente didácticos, cuyo objetivo es brindar al estudiante mayores elementos de juicio para la comprensión de la materia, por lo tanto no tiene n comercial.
ANEXO 1 ÁRBOlES BAlANCEADOS INTRODUCCIóN Aunque las operaciones de búsqueda e inserción de elementos se realizan de una manera eciente en los árboles de búsqueda binaria, éstos resultan inecientes cuando el árbol crece o decrece descontroladamente, aún más cuando los elementos que ingresamos en el árbol están ordenados (Ver
gura 1), lo que causa un aumento considerable en el número de comparaciones que se deben realizar cuando se desea ubicar un determinado elemento
Fig: 1 Árbol Binario de Búsqueda Como una solución a este tipo de problemas, es necesaria la utilización de los árboles balanceados, los cuales tienen como objetivo mantener el árbol lo más equilibrado posible. Estos recurren a diferentes
métodos de ordenamiento de los nodos que lo componen, tratando de ubicar a dichos nodos de una forma que no afecte el balanceo del árbol. El objetivo principal del balanceo es minimizar (optimizar) el número de comparaciones a realizar para lograr un mejor tiempo de acceso a sus datos
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
47
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
ÁRBOl BINARIO EQUIlIBRADO, ÁRBOlES AVl Los árboles AVL, son árboles ordenados o de búsqueda que además cumplen las condiciones de balanceo para cada uno de sus nodos.
A los nodos normalmente utilizados en los árboles binarios se ha agregado un nuevo campo de tipo entero (Ver Código 1), en el cual se almacenará lo que conoceremos como factor de equilibrio. El valor almacenado en este campo dependerá directamente de la altura de los subárboles hijos del nodo en el cual nos encontramos, el cual para ser considerado como árbol equilibrado deberá estar entre 1 y -1 resultando de la resta de la altura del subárbol derecho menos la altura del subárbol izquierdo. (Ver gura 2) Código 1: Declaración del nodo struct nodo{ TipoElemento dato;
int fe; struct nodo *izdo, *dcho; };
typedef struct nodo Nodo;
Fig: 2 Árbol Equilibrado con el factor de equilibrio de cada nodo
INSERCIóN La inserción de elementos en este tipo de árboles debe realizarse basándonos en los algoritmos
utilizados con los Árboles de Búsqueda Binaria, es decir, siguiendo un camino de búsqueda mediante la comparación de claves.
Esta inserción de elementos puede hacer que aumente la altura de una rama de manera que cambie el factor de equilibrio de la raíz del subárbol. Este hecho hace necesario que el algoritmo de inserción regrese por el camino de búsqueda actualizando el factor de equilibrio de los nodos. (Ver gura 3) Una nueva inserción o eliminación de claves, puede destruir el criterio de equilibrio de los nodos del
árbol. Se debe restaurar esa condición de equilibrio antes de dar por nalizada la operación. 48
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
Fig: 3 Árbol Equilibrado, después de insertar la clave 17 Pueden existir cuatro casos durante la inserción de un nuevo elemento en el árbol, en los cuales se rompa la condición de equilibrio y debamos realizar los pasos necesarios para restablecer tal equilibrio: (Ver gura 4) 1.
Inserción en el subárbol izquierdo de la rama izquierda de un nodo A
2.
Inserción en el subárbol derecho de la rama izquierda de un nodo A
3.
Inserción en el subárbol derecho de la rama derecha de un nodo A
4.
Inserción en el subárbol izquierdo de la rama derecha de un nodo A
Fig: 4 Cuatro tipos de restructuraciones del equilibrio de un nodo El primer y tercer caso (izquierda-izquierda, derecha-derecha) se resuelven con una rotación simple . El segundo y cuarto caso (izquierda-derecha, derecha-izquierda) se resuelven con una rotación doble. La rotación simple implica a dos nodos, el nodo A con factor de equilibrio igual a 2 y el descendiente
derecho o izquierdo según el caso. En cambio en la rotación doble, están implicados los tres nodos, el nodo A, el descendiente izquierdo y el descendiente derecho de este; o bien el caso simétrico. Una restructuración de los nodos implicados en la violación del equilibrio, ya sea mediante rotación
simple o doble, hace que se recupere el equilibrio en todo el árbol, por lo cual ya no es necesario seguir analizando los nodos del camino de búsqueda.
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
49
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
ROTACIóN SIMPlE rotación simple resuelve la violación de equilibrio de un nodo izquierda-izquierda, simétrica a la derecha-derecha. El árbol de la gura 5a tiene el nodo C con factor de equilibrio -1; el árbol de la gura 5b es el resultado de insertar el nodo A . Resulta que ha crecido la altura de la rama izquierda, es un desequilibrio izquierda-izquierda que se resuelve con una rotación simple, que en este caso se puede denominar rotación II. La gura 5c es el resultante de la rotación, en el que el nodo B se ha convertido en la raíz, el nodo C su rama derecha y el nodo A continua como rama izquierda. Con estos 1La
movimientos el árbol sigue siendo de búsqueda y se equilibra.
Fig: 5 Inserción de clave por la izquierda y solución mediante una rotación simple II En el caso de que la violación se realice por la derecha, procederemos a aplicar simplemente una rotación DD que es la recíproca de la que acabamos de analizar. El movimiento de los punteros para realizar la rotación II se da como podemos ver a continuación en el siguiente código.
Código 2: Movimiento de punteros en la rotación II n->izdo = n1->dcho n1->dcho = n n = n1 A continuación podemos observar un ejemplo en el cual debemos realizar una rotación a la izquierda
para restaurar la condición de equilibrio luego de que esta ha sido rota por la inserción de un nuevo elemento.
1
Algoritmos y estructuras de datos, una perspectiva en C. Luis Joyanes Aguilar, Ignacio Zahonero Martínez, Primera edición, España, pág. 463 50
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
Fig: 6 Rotación simple a la izquierda en un árbol después de insertar la clave 5
ROTACIóN DOBlE 2
Con los movimientos de punteros que se realizan en la rotación simple o es posible resolver todos
los casos de violación de criterio de equilibrio. En la gura 7a se observa un árbol de búsqueda desequilibrado, con factores de equilibrio +2, -1 y 0. La gura 7b aplica la rotación simple, rotación DD. La única solución consiste en subir el nodo 40 como raíz del subárbol, como rama izquierda situar al nodo 30 y como rama derecha al nodo 60, la altura del subárbol resultante es la misma que antes de insertar. Se ha realizado una rotación doble, derecha-izquierda, en la que intervienen los tres nodos.
Fig: 7 a) árbol después de insertar la clave 40, b) Rotación DD. c) Rotación doble que resuelve el problema. A continuación podremos ver un ejemplo en el cual se inserta la clave 60, con lo cual se rompe el equilibrio y hay una alteración de los factores de equilibrio de los nodos involucrados. Se restablece el equilibrio mediante una rotación doble, simétrica con respecto al ejemplo anterior como se muestra
en la gura 8. 2
Algoritmos y estructuras de datos, una perspectiva en C. Luis Joyanes Aguilar, Ignacio Zahonero Martínez, Primera edición, España, pág. 465
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
51
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
Fig: 8 a) Árbol equilibrado de búsqueda después de insertar la clave 60. b) Rotación doble, izquierda derecha. La rotación doble resuelve dos casos simétricos, se puede denominar rotación ID y rotación DI. En
la rotación doble hay que mover los punteros de tres nodos, el nodo padre, el descendiente y el descendiente del descendiente por la rama contraria. El movimiento de los punteros para realizar la rotación ID se da como podemos ver a continuación en el siguiente código.
Código 3: Movimiento de punteros en la rotación ID n1->dcho n2->izdo n->izdo n2->dcho n
= n2->izdo = n1 = n2->dcho =n = n2
Los factores de equilibrio de los nodos implicados en la rotación ID depende del factor de equilibrio, antes de la inserción, del nodo apuntado por n2, según la siguiente tabla.
Si
n2->fe = -1
n2->fe = 0
n2->fe = 1
n->fe = 1
n->fe = 0
n->fe = 0
n1->fe = 0
n1->fe = 0
n1->fe = -1
n2->fe = 0
n2->fe = 0
n2->fe = 0
Los movimientos de los punteros para realizar la rotación DI son los siguientes;
52
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
Código 4: Movimiento de punteros en la rotación DI n1->izdo n2->dcho n->dcho n2->izdo n
= n2->dcho = n1 = n2->izdo =n = n2
Los factores de equilibrio de los nodos implicados en la rotación DI depende del factor de equilibrio, antes de la inserción, del nodo apuntado por n2, según la siguiente tabla.
Si
n2->fe = -1
n2->fe = 0
n2->fe = 1
n->fe = 0
n->fe = 0
n->fe = -1
n1->fe = 1
n1->fe = 0
n1->fe = 0
n2->fe = 0
n2->fe = 0
n2->fe = 0
INSERCIóN EN C CON BAlANCEO y ROTACIONES La realización en C del proceso de inserción de un nuevo nodo primero utiliza el algoritmo recursivo desarrollado en los árboles de búsqueda. Una vez insertado, se activa u ag (indicador, bandera) si
ha crecido en altura para regresar por el camino de búsqueda y determinar los nuevos factores de equilibrio de los nodos que forman el camino que va hacia la raíz. Cuando la inserción se ha realizado por la rama izquierda del nodo, la altura crece por la izquierda y, por tanto, disminuye en 1 el factor de equilibrio, en el caso de que la inserción se haga por la rama derecha, el factor de equilibrio aumenta en 1. Si la altura del subárbol no aumenta, el proceso termina. Si se produce un desequilibrio, se realiza la correspondiente rotación y el proceso termina ya que cualquier rotación tiene la propiedad de que la altura del subárbol resultante es la misma que antes de la inserción. A continuación se escribe el código en C de los cuatro tipos de rotaciones y de la operación de inserción.
Código 5: Rotaciones void rotacionII(Nodo** n, Nodo* n1){ (*n)->izdo = n1->dcho; n1->dcho = (*n); if(n1->fe == -1){ (*n)->fe = 0; n1->fe = 0;
/* actualización de los factores de equilibrio*/ /*en la inserción siempre se cumple */
}else{
(*n)->fe = -1; n1->fe = 1; }
(*n) = n1; }
void rotacionDD(Nodo** n, Nodo* n1){ (*n)->dcho = n1->izdo; UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
53
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
n1->izdo = (*n); if(n1->fe == +1){ (*n)->fe = 0; n1->fe = 0;
/* actualización de los factores de equilibrio*/ /*en la inserción siempre se cumple */
}else{
(*n)->fe = +1; n1->fe = -1; }
(*n) = n1; }
void rotacionID(Nodo** n, Nodo* n1){ Nodo* n2; n2 = n1->dcho; (*n)->izdo = n2->dcho; n2->dcho = *n; n1->dcho = n2->izdo; n2->izdo = n1; /* actualización de los factores de equilibrio*/ if(n2->fe == +1) n1->fe = -1; else
n1->fe = 0; if(n2->fe == -1) (*n)->fe = 1; else
(*n)->fe = 0; n2->fe = 0; (*n) = n2; }
void rotacionDI(Nodo** n, Nodo* n1){ Nodo* n2; n2 = n1->izdo; (*n)->dcho = n2->izdo; n2->izdo = *n; n1->izdo = n2->dcho; n2->dcho = n1; /* actualización de los factores de equilibrio*/ if(n2->fe == +1) (*n)->fe = -1; else
(*n)->fe = 0;
54
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
if(n2->fe == -1) n1->fe = 1; else
n1->fe = 0; n2->fe = 0; (*n) = n2; }
Código 6: Inserción con balanceo void insertarEquilibrado(Nodo** raiz, TipoElemento clave, int* h){ Nodo* n1; if(!(*raiz)){
*raíz = crearNodo(clave); *h = 1; }else if(clave < (*raiz)->dato){ insertarEquilibrado(&((*raiz)->izdo), clave, h); /* regreso por los nodos del camino*/ if(*h){ /* reduce en 1 el fe al aumentar altura de rama izquierda*/ switch((*raiz)->fe){ case 1: (*raiz)->fe = 0; (*h) = 0; break;
case 0: (*raiz)->fe = -1; break;
case -1: /* viola el equilibrio, rotación izquierda*/ n1 = (*raiz)->izdo; if(n1->fe == -1) rotacionII(raíz, n1); else
rotacionID(raíz, n1); (*h) = 0; break; } }
}else if(clave > (*raiz)->dato){ insertarEquilibrado(&((*raiz)->dcho), clave, h); /* regreso por los nodos del camino*/ if(*h){ /* incrementa en 1 el fe al aumentar altura de rama derecha*/ switch((*raiz)->fe){ case 1: /* viola el equilibrio, rotación derecha*/ n1 = (*raiz)->dcho; if(n1->fe == +1) rotacionDD(raíz, n1); else
rotacionDI(raíz, n1); (*h) = 0; break; UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
55
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
case 0: (*raiz)->fe = +1; break;
case -1: (*h) = 0; break; } } }else{
puts(“En árboles de búsqueda o puede haber claves repetidas.”);
(*h) = 0; } }
ElIMINACIóN DE UN NODO EN UN ÁRBOl EQUIlIBRADO El algoritmo de eliminación puede descomponerse en dos partes diferenciadas. La primera sigue la estrategia de la eliminación en árboles de búsqueda. La segunda es la actualización del factor de equilibrio, para lo que recorre el camino de búsqueda hacia la raíz, actualizando el factor de equilibrio
de los nodos. Con la eliminación, la altura de la rama en que se encuentra el nodo disminuye en 1. Si después de la actualización de u nodo ocurre que se viola la condición de equilibrio, el fe = ±2, hay que restaurar el equilibrio con una rotación simple o doble.
En la gura 9a se muestra el árbol equilibrado con el factor de equilibrio de cada nodo, en la gura b el árbol luego de eliminar la clave 15, al actualizar el factor de equilibrio del nodo 28 pasa a valer +2 ya que se ha eliminado por su rama izquierda, hay que restablecer el equilibrio con una rotación, en este caso con una rotación doble.
Fig: 9 a) Árbol de búsqueda equilibrado. b) Después de eliminar la clave 15 y actualizar los factores de equilibrio.
56
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
Agoritmo para eiminar un nodo en un árbo equiibrado
3
Una vez localizado el nodo a eliminar, podemos distinguir dos casos para su eliminación.
1.
El nodo a borrar es un nodo hoja, o con un único descendiente. Entonces simplemente se suprime, o bien se sustituye por su descendiente.
2.
El nodo a eliminar tiene dos subárboles. En este caso se busca el nodo mas a la derecha del subárbol izquierdo, es decir, el de mayor clave en el subárbol de los menores , se copia este en el nodo a eliminar y por último se elimina el nodo copiado (que tiene las características del caso primero).
Fig: 10 a) Árbol de búsqueda equilibrado. b) Árbol después de eliminar el nodo 90. Una vez eliminado el nodo, el algoritmo tiene que prever actualizar los factores de equilibrio de los
nodos que han formado el camino de búsqueda ya que la altura de alguna de las dos ramas ha decrecido. Por consiguiente, regresa por el camino de búsqueda, hacia la raíz, calculado los nuevos factores de equilibrio de los nodos visitados. No siempre es necesario recorrer todo el camino de regreso, si se actualiza un nodo con factor de equilibrio 0, el nuevo será ±1, pero la altura neta del subárbol co raíz el nodo actualizado no ha cambiado, entonces el algoritmo termina ya que los factores de equilibrio de los nodos restantes no cambia. La gura 10a muestra el árbol equilibrado, en la gura 10b el árbol resultante después de eliminar el nodo con la clave 90, al volver por el camino de búsqueda el nodo 70 su factor de equilibrio pasa a ser 0, el nodo 60 tiene como factor 0 se actualiza y pasa a ser -1, su altura neta no ha cambiado, sigue siendo 3, por lo que el algoritmo termina. Otro caso a considerar en la parte de actualización es que un nodo tenga como fe=±1, y la eliminación se haya hecho por la rama más alta, entonces el equilibrio mejora, pasa a ser cero. Ahora bien, en este caso la altura del subárbol a disminuido, por lo que el algoritmo debe seguir retrocediendo por los
nodos por si es necesario una restructuración. En la gura 11b se tiene el árbol de búsqueda después de eliminar el nodo con la clave 25 del árbol. Al actualizar los nodos del camino de búsqueda, el nodo 20 tiene como fe = +1, éste pasa a ser 0 ya que se ha eliminado por la rama derecha. El proceso continua ya que la altura del subárbol de raíz 20 a disminuido, el nodo antecesor, 29, tiene como fe=+1, éste pasa a ser +2 ya que se ha eliminado por su rama izquierda, viola la condición de equilibrio. Para restaurar el equilibrio es necesario, en este caso, una rotación simple, derecha-derecha, ya que el 3
Algoritmos y estructuras de datos, una perspectiva en C. Luis Joyanes Aguilar, Ignacio Zahonero Martínez, Primera edición, España, pág. 473
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
57
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
nodo de la rama derecha de 29 tiene como fe=0. La gura 11c es el árbol equilibrado después de la rotación.
Los nodos que tienen como fe = ±1, al actualizar el factor de equilibrio éste puede pasar a ±2, hay que reestructurarlos con una rotación simple o doble. El tipo concreto de rotación depende del fe del nodo problema, apuntado por n, y del nodo descendiente n1:
Fig: 11 a) Árbol de búsqueda equilibrado. b) Árbol después de eliminar el nodo 25. c) Árbol una vez realizada la rotación derecha-derecha •
Si n->fe = +2, entonces n1 es el hijo derecho (n1 = n->dcho) de tal forma que si n1>fe ≥0 la rotación aplicar es derecha-derecha. Y si n1->fe == -1, la rotación aplicar es derecha-izquierda.
•
De forma simética, si n1->fe==-2, entonces n1 es el hijo izquierdo (n1=n->izdo) de tal forma que si n1->fe ≤ 0 la rotación a aplicar es izquierda-izquierda. Y si n1->fe == +1, la rotación a aplicar es izquierda-derecha.
En el proceso de eliminar una clave una vez que se aplica una rotación para re stablecer el equilibrio de
un nodo, la altura del subárbol puede ser que haya disminuido por lo que el proceso de actualización del fe debe continuar; puede ocurrir que otro nodo del camino hacia la raíz viole la condición de equilibrio y sea necesario aplicar otra rotación. La gura 12b es un árbol de búsqueda después de haber eliminado la clave 21, y con la actualización de los factores de equilibrio, el nodo 43 está desequilibrado, hay que aplicar una rotación derecha-derecha. La gura 12c muestra el árbol después de la rotación y la posterior actualización del factor de equilibrio del nodo 70, que también exije aplicar otra rotación, en este caso derecha-izquierda. La gura 12d es el árbol equilibrado después de la rotación y n del algoritmo. 58
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
ANEXOS
Guía didáctica: Estructura de Datos y Algoritmos II
El algoritmo de eliminación de una clave en un árbol de búsqueda AVL puede necesitar aplicar más de una rotación para que el árbol resultante siga siendo equilibrado.
Fig: 12 a) Árbol de búsqueda equilibrado. b) Árbol después de eliminar el nodo 21. c) Árbol una vez realizada la rotación derecha-derecha. d) Árbol después de la nueva rotación, derecha-izquierda La función que implementa la operación de eliminación requiere utilizar un argumento lógico para
indicar que se ha producido un cambio en la altura de una rama. Entonces el parámetro cambiaAltura se va a activar cuando la altura del subárbol disminuya, debido a la eliminación de un nodo, o bien
porque al aplicar las rotaciones se haya reducido la altura del subárbol. Además para aislar el proceso de los diferentes casos que ocurren cuando disminuye la altura se introducen dos funciones, equilibrar1() y equilibrar2(). La primera se nvoca cuando la altura de la rama izquierda ha disminuido y, de forma simétrica, equilibrar2() se invoca cuando la altura de la rama derecha es la que disminuye. En equilibrar1(), al disminuir la altura de la rama izquierda, el factor de equilibrio se incrementa en 1, por lo que de violarse el factor de equilibrio la rotación que se aplica para equilibrar el nodo es del tipo derecha-derecha o derecha-izquierda. Y de forma simétrica, en equilibrar2(), al disminuir la altura de la rama derecha, el factor de equilibrio disminuye en 1, por lo que de violarse el factor de equilibrio la rotación que se aplica para equilibrar el nodo es del tipo izquierda-izquierda o izquierda-derecha.
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
59
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
Código 7: Operaciones de eliminación en un árbol equilibrado void borrarBalanceado(Nodo** raiz, TipoElemento clave, int* cambiaAltura){ if(!(*raiz)){
puts(“!! Nodo no encontrado !!”); *cambiaAltura = 0; }else if(clave < (*raiz)->dato){ borrarBalanceado(&((*raiz)->izdo), clave, cambiaAltura); if(*cambiaAltura)
equilibrar1(raíz, cambiaAltura); }else if(clave > (*raiz)->dato){ borrarBalanceado(&((*raiz)->dcho), clave, cambiaAltura); if(*cambiaAltura) equilibrar2(raíz, cambiaAltura);
}else{
/* Nodo Encontrado*/ Nodo* q; /* Puntero al nodo a suprimir*/ q = (*raiz); if(q->izdo == NULL){ (*raiz) = q->dcho; *cambiaAltura = 1; }else if(q->dcho == NULL){ (*raiz) = q->izdo; *cambiaAltura = 1; }else{ /* tiene rama izquierda y derecha*/ reemplazar(&q, &(q->izdo), cambiaAltura); if(*cambiaAltura)
equilibrar1(raíz, cambiaAltura); } free(q); } }
void reemplazar(Nodo** n, Nodo** act, int *cambiaAltura){ if((*act)->dcho){ reemplazar(n, &((*act)->dcho), cambiaAltura); if(*cambiaAltura) equilibrar2(act, cambiaAltura); }else{
(*n)->dato = (*act)->dato; (*n) = *act; (*act) = (*act)->izdo; *cambiaAltura = 1; } }
void equilibrar1(Nodo** n, int* cambiaAltura){ Nodo* n1; switch ((*n)->fe){ case -1: (*n)->fe = 0; break; 60
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
case 0: (*n)->fe = 1; *cambiaAltura = 0; break;
case +1: /*Es necesario aplicar un tipo de rotación derecha*/ n1 = (*n)->dcho; if(n1->fe >= 0){ if(n1->fe == 0) /*altura no vuelve a disminuir*/ *cambiaAltura = 0; rotacionDD(n, n1); }else
rotaciónDI(n, n1) break; } }
void equilibrar2(Nodo** n, int* cambiaAltura){ Nodo* n1; switch ((*n)->fe){ case -1: /*Se aplica un tipo de rotación izquierda*/ n1 = (*n)->izdo; if(n1->fe <= 0){ if(n1->fe == 0) *cambiaAltura = 0; rotacionII(n, n1); }else
rotaciónID(n, n1) break;
case 0: (*n)->fe = -1; *cambiaAltura = 0; break;
case +1: (*n)->fe = 0; break; } }
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja
61
Guía didáctica: Estructura de Datos y Algoritmos II
ANEXOS
ANEXO 2 ÁRBOlES B INTRODUCCIóN Aunque los árboles-B son árboles de búsqueda, la “B” no signica “binario”, ya que:
4
•
Los árboles-B nunca son binarios.
•
Y tampoco es porque sean árboles de búsqueda, ya que en inglés se denominan B-trees.
•
Tampoco es porque sean balanceados, ya que no suelen serlo.
En cualquier caso, tampoco es demasiado importante el signicado de la "B", si es que lo tiene, lo interesante realmente es su algoritmo.
Los árboles B a menudo son utilizados para evitar los inconvenientes que encontramos cuando trabajamos con árboles binarios de búsqueda, sobre todo cuando se ordenan cheros, por lo cual se han convertido en el sistema de indexación más utilizado.
ÁRBOlES B En primer lugar al hablar de un árbol de orden m, estamos hablando del máximo número de enlaces que puede tener un nodo, así mismo dicho nodo solamente podrá tener un máximo de m-1 claves o campos de información. En este caso nosotros haremos ejercicios con un árbol de orden cinco con cuatro claves o campos de información (Ver gura 1). Campos de información
Enlaces
Fig: 1 Nodo para un árbol B de orden 5 Así mismo: •
Los árboles B, siempre están perfectamente equilibrados.
•
Todos los nodos, excepto la raíz, deben tener entre m/2 y todos los elementos de información ocupados, es decir en nuestro ejemplo cada nodo debe tener por lo menos dos campos de
información ocupados y máximo cuatro. •
La raíz es el único nodo que puede tener entre 1 y el total de campos de información ocupados, es decir en nuestro ejemplo entre uno y cuatro.
•
Todas las hojas o nodos terminales deben estar al mismo nivel.
4
http://articulos.conclase.net/arboles-b/index.html 62
UNIVERSIDAD TÉCNICA PARTICULAR DE LOJA
La Universidad Católica de Loja