Cont. Arbol Binario de Búsqueda (2). Sobre los recorridos Las versiones recursivas de los...

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

Transcript of Cont. Arbol Binario de Búsqueda (2). Sobre los recorridos Las versiones recursivas de los...

Page 1: 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.

Cont. Arbol Binario de Búsqueda (2)

Page 2: 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.

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

Page 3: 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.

• 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

Page 4: 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.

Implementación

Se agrega a la clase ArbolBin la siguiente declaración:

void inorden_nr(Nodo *r);

Inorden No Recursivo

Page 5: 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.

void ArbolBin::inorden_nr(Nodo *r){

Nodo *vec[100]; // Vector de punteros a Nodosint j=0;

//Se insertan en el vector de punteros de nodos//los que están en la "rama" izquierda de la raízwhile(r != NULL){

j++;vec[j] = r;r= r ->hijoIzq;

}

Page 6: 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.

/* 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<< (r->dato).codigo << endl;r = r->hijoDer;while(r != NULL){

j++;vec[j] = r;r= r ->hijoIzq;

}}

}

Page 7: 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.

• 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

Page 8: 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.

• 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)

• Para comprender el algoritmo de inserción en AVL se requiere entender primero que son las rotacionesrotaciones

Page 9: 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.

• 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

Page 10: 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.

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

Page 11: 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.

Operaciones de rebalanceo:

• Consiste 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 inordeninorden sea el mismo que antes del reacomodo.

• Estas operaciones se conocen como rotaciones

Page 12: 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.

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

Page 13: 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.

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

Page 14: 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.

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.

Page 15: 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.

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)

Page 16: 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.

+2 0 P c Q b +1 0 0 Q b a c P 0 a

Antes Después

Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

Page 17: 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.

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 = 0FIN

Luego se verá la codificación en C++ en el algoritmo completo de inserción

Page 18: 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.

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.

Page 19: 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.

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)

Page 20: 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.

Antes Después

Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

-2 0 P a Q b -1 0 0 Q b P a c 0 c

Page 21: 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.

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 = 0FIN

Luego se verá la codificación en C++ en el algoritmo completo de inserción

Page 22: 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.

• 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.

Page 23: 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.

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

Page 24: 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.

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

Page 25: 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.

Antes Después

Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

+2 0 P c R b -1 0 0 Q a Q a c P 0 R b

Page 26: 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.

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:

Page 27: 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.

+2 0 P e R d -1 0 0 -1 Q b f Q b e P 0 +1 0 0 0 a d R a c f 0 c

Antes Después

Page 28: 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.

• 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

Page 29: 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.

Pseudo Código de la operación:Doble_Rotacion_a_la_Derecha(P, Q)

R = Q -> hijoDer //Se obtiene R a partir de Qfactor_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 = -1Q -> FB = 0

:-1: P -> FB = 0 Q -> FB = 1

FIN(Caso)R -> FB = 0Q = R //Se deja la raíz en Q

FIN Luego se verá la codificación en C++ en el algoritmo completo de inserción

Page 30: 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.

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.

Page 31: 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.

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

Page 32: 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.

Antes Después

Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

-2 0 P c R b +1 0 0 Q a P c a Q 0 R b

Page 33: 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.

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:

Page 34: 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.

Antes Después

-2 0 P e R a 0 +1 0 -1 b f Q P e f Q +1 0 0 0 0 R a d b c d 0 C

Page 35: 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.

• 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

Page 36: 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.

Pseudo Código de la operación:Doble_Rotacion_a_la_Izquierda(P, Q)

R = Q -> hijoIzq //Se obtiene R a partir de Qfactor_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 = 0Q = R // Se deja la raíz en Q

FIN Luego se verá la codificación en C++ en el algoritmo completo de inserción