La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Cont. Arbol Binario de Búsqueda (2). Sobre los recorridos Las versiones recursivas de los recorridos son costosas debido a la gran cantidad de llamadas.

Presentaciones similares


Presentación del tema: "Cont. Arbol Binario de Búsqueda (2). Sobre los recorridos Las versiones recursivas de los recorridos son costosas debido a la gran cantidad de llamadas."— Transcripción de la presentación:

1 Cont. Arbol Binario de Búsqueda (2)

2 Sobre los recorridos Las versiones recursivas de los recorridos son costosas debido a la gran cantidad de llamadas recursivas que pueden llegar a copar la pila (stack) Se prefieren entonces versiones no recursivas para dichos recorridos

3 Las versiones no recursivas de estos recorridos requieren el uso de un arreglo (o lista) auxiliar de apuntadores a los nodos Su codificación es menos clara que sus versiones recursivas Se verá la versión no recursiva de inorden

4 Implementación Se agrega a la clase ArbolBin la siguiente declaración: void inorden_nr(Nodo *r); Inorden No Recursivo

5 void ArbolBin::inorden_nr(Nodo *r) { Nodo *vec[100]; // Vector de punteros a Nodos int j=0; //Se insertan en el vector de punteros de nodos //los que están en la "rama" izquierda de la raíz while(r != NULL) { j++; vec[j] = r; r= r ->hijoIzq; }

6 /* Se saca el último puntero insertado en el vector, imprimimos y nos pasamos a su hijo derecho para realizar el mismo proceso hecho a la raíz */ while(j>0){ r = vec[j]; j--; cout dato).codigo << endl; r = r->hijoDer; while(r != NULL) { j++; vec[j] = r; r= r ->hijoIzq; }

7 Son árboles binarios balanceados por altura Sus inventores fueron G. Adelson-Velskii y E. Landis Concebidos especialmente para ser aplicados en los árboles binarios de búsqueda Evitan que los árboles se “degeneren” (sesgados a derecha o izquierda) Árboles AVL

8 Su implementación es más compleja que un árbol binario simple Las operaciones de búsqueda, inserción y borrado mantienen un buen tiempo de desempeño O(Log n) rotacionesPara comprender el algoritmo de inserción en AVL se requiere entender primero que son las rotaciones

9 La operación de borrado es bastante compleja Se han propuesto variantes y mejoras a los árboles AVL: Árboles rojinegros, Árboles Splay, AA-Árboles Se verá a continuación las rotaciones y luego el algoritmo de inserción

10 Factor de Balance: Concepto clave en los árboles AVL El factor de balance para cualquier nodo x del árbol se define como la diferencia entre la altura del subárbol izquierdo de x y la altura del subárbol derecho de x. Es decir: FB(x) = Altura(subárbol Izq. de x) – Altura(subárbol Der. de x) Un árbol binario H es AVL si: │FB (x)│ < 2,  x  H

11 Operaciones de rebalanceo: inordenConsiste en reacomodar los registros de un árbol binario de tal forma que los factores de balance de todos los nodos sean -1, 0, ó 1 y que el recorrido inorden sea el mismo que antes del reacomodo. Estas operaciones se conocen como rotaciones

12 Operaciones de Rebalanceo: 1. Rotación a la derecha 2. Rotación a la izquierda 3. Doble rotación a la derecha 4. Doble rotación a la izquierda

13 Para explicar lo referente a las rotaciones se asume la siguiente convención: Sea P el puntero al nodo con factor de balance no permitido (+2 ó -2) Sea Q el puntero al hijo izquierdo o al hijo derecho de P, dependiendo de si FB(P)=+2 ó FB(P)= -2

14 Rotación a la Derecha Se efectúa cuando: FB (P) = + 2 FB (Q) = + 1 Consiste en girar, en sentido de las manecillas del reloj, el registro P alrededor del registro Q.

15 Consecuencias: P pasará a ser el nuevo hijo derecho de Q El anterior hijo derecho de Q será el nuevo hijo izquierdo de P Q será la nueva raíz del árbol balanceado Los nuevos factores de balance de P y Q serán cero (0) La altura del árbol balanceado disminuye en uno (1)

16 Antes Después Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

17 Pseudo Código de la operación: Rotacion_a_la_Derecha(P, Q) P -> hijoIzq = Q -> hijoDer Q -> hijoDer = P P -> FB = 0 Q -> FB = 0 FIN Luego se verá la codificación en C++ en el algoritmo completo de inserción

18 Rotación a la Izquierda Se efectúa cuando: FB (P) = - 2 FB (Q) = - 1 Consiste en girar, en sentido contrario de las manecillas del reloj, P alrededor de Q.

19 Consecuencias: P será el nuevo hijo izquierdo de Q El nuevo hijo derecho de P será el anterior hijo izquierdo Q Q será la nueva raíz del árbol balanceado Los factores de balance P y Q quedarán en cero La altura del árbol balanceado disminuye en uno (1)

20 Antes Después Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

21 Pseudo Código de la operación: Rotacion_a_la_Izquierda(P, Q) P -> hijoDer = Q -> hijoIzq Q -> hijoIzq = P P -> FB = 0 Q -> FB = 0 FIN Luego se verá la codificación en C++ en el algoritmo completo de inserción

22 Las últimas 2 rotaciones se denominan dobles Para definirlas se adopta la siguiente convención: Sea R el registro que representa el hijo izquierdo o el hijo derecho de Q dependiendo de si el factor de balance de Q es +1 ó -1.

23 Doble Rotación a la Derecha Se efectúa cuando: FB (P) = + 2 FB (Q) = - 1 Consiste en: Una rotación a la izquierda de Q alrededor de R seguida de una rotación a la derecha de P alrededor de R

24 Consecuencias: R será la nueva raíz del árbol balanceado P será el nuevo hijo derecho de R Q será el nuevo hijo izquierdo de R El anterior hijo derecho de R será el nuevo hijo izquierdo de P El anterior hijo izquierdo de R será el nuevo hijo derecho de Q La altura del árbol balanceado disminuye en uno (1) El factor de balance de R será cero Los factores de balance de P y Q tomarán nuevos valores, los cuales dependerán del factor de balance inicial del registro R el cual puede ser -1, 0 ó 1

25 Antes Después Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

26 En el caso anterior el FB del nodo R es 0. Para este caso los FB finales de los nodos P y Q serán cero. Si FB inicial de R es cero entonces: FB(P) = 0 y FB(Q) = 0 Veamos los otros casos:

27 Antes Después

28 En conclusión si FB inicial de R es 1 entonces FB(P) = -1 y FB(Q) = 0 De manera similar se puede comprobar que si FB inicial de R es -1entonces FB(P) = 0 y FB(Q) = 1

29 Pseudo Código de la operación: Doble_Rotacion_a_la_Derecha(P, Q) R = Q -> hijoDer //Se obtiene R a partir de Q factor_R = R->FB //Se guarda el factor de balance de R Rotacion_a_la_Izquierda(Q, R) Rotacion_a_la_Derecha(P, R) Caso de factor_R :0: P -> FB = 0 Q -> FB = 0 :1: P -> FB = -1 Q -> FB = 0 :-1: P -> FB = 0 Q -> FB = 1 FIN(Caso) R -> FB = 0 Q = R //Se deja la raíz en Q FIN Luego se verá la codificación en C++ en el algoritmo completo de inserción

30 Doble Rotación a la Izquierda Se efectúa cuando: FB (P) = - 2 FB (Q) = +1 Consiste en: Una rotación a la derecha de Q alrededor de R seguida de una rotación a la izquierda de P alrededor de R.

31 Consecuencias: R será la nueva raíz del árbol balanceado P será el nuevo hijo izquierdo de R Q será el nuevo hijo derecho de R El anterior hijo derecho de R será el nuevo hijo izquierdo de Q El anterior hijo izquierdo de R será el nuevo hijo derecho de P La altura del árbol balanceado disminuye en uno (1) El FB de R será cero Los factores de balance de P y Q tomarán nuevos valores, los cuales dependerán del factor de balance inicial del registro R el cual puede ser -1, 0 ó 1

32 Antes Después Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

33 En el caso anterior el FB del nodo R es 0. Para este caso los FB finales de los nodos P y Q serán cero. Si FB inicial de R es cero entonces: FB(P) = 0 y FB(Q) = 0 Veamos los otros casos:

34 Antes Después

35 En conclusión si FB inicial de R es 1 entonces FB(P) = 0 y FB(Q) = -1 De manera similar se puede comprobar que si FB inicial de R es -1entonces FB(P) = 1 y FB(Q) = 0

36 Pseudo Código de la operación: Doble_Rotacion_a_la_Izquierda(P, Q) R = Q -> hijoIzq //Se obtiene R a partir de Q factor_R = R->FB//Se guarda el factor de balance de R Rotacion_a_la_Derecha(Q, R) Rotacion_a_la_Izquierda(P, R) Caso de factor_R :0: P -> FB = 0 Q -> FB = 0 :1: P -> FB = 0 Q -> FB = -1 :-1: P -> FB = 1 Q -> FB = 0 FIN(Caso) R -> FB = 0 Q = R // Se deja la raíz en Q FIN Luego se verá la codificación en C++ en el algoritmo completo de inserción


Descargar ppt "Cont. Arbol Binario de Búsqueda (2). Sobre los recorridos Las versiones recursivas de los recorridos son costosas debido a la gran cantidad de llamadas."

Presentaciones similares


Anuncios Google