Title: Ordenamientos ms importantes de rboles
1Ordenamientos más importantes de árboles
- PROCEDURE Ord_Pre (nÁrbol)
- BEGIN
- Lista n
- FOR cada subarbol c de n, si los hay,
- en orden de izquierda a derecha DO
- Ord_Pre (c)
- END
- END Ord_Pre
2Ordenamientos más importantes de árboles
- PROCEDURE Ord_Pos (nÁrbol)
- BEGIN
- FOR cada subarbol c de n, si los hay,
- en orden de izquierda a derecha DO
- Ord_Pos (c)
- END
- Lista n
- END Ord_Pre
3Ordenamientos más importantes de árboles
- PROCEDURE Ord_Sim (nÁrbol)
- BEGIN
- IF n es un árbol compuesto sólo de raíz THEN
- Lista n
- ELSE
- Ord_Sim (hijo más a la izquierda de
n) - Lista n
- FOR cada subárbol c de n, excepto el de
más a la izquierda en orden de izquierda a
derecha DO - Ord_Sim(c)
- END
- END
- END
-
4TAD ÁRBOL
- NOMBRE
- Arbol (elemento)
-
- CONJUNTOS
- A conjunto de árboles
- I conjunto de elementos
- B conjunto de booleanos true, false
- M conjunto de mensajes el árbol está
vacío,no hijo izq,no hermano
derecho,el elemento no tiene padre
5TAD ÁRBOL
- SINTAXIS
- crear-árbol A
- creari Ix Ai A
- anular A A U M
- es-vacio-árbol A B
- etiqueta A I U M
- padre A A U M
- hijo-mas-izq A A U M
- hermano-der A AUM
-
6TAD ÁRBOL
- SEMANTICA ? e ? I, ? Aj ? A
- hijo-más-izq (crear-árbol) el árbol está
vacio - hijo-más-izq (creari(e,A1,.Ai)) si i0 ? no
hijo izq A1 - hermano-der (crear-árbol) el árbol está
vacío - hermano-der (creari (e,A1,..... Ai)) no
hermano derecho - hermano-der(hijo-más-izq(creari(e,A1,....Ai)))
- si i1 ?no hermano derecho
- hijo-más-izq (creari-1(e,A2,.....Ai))
- anular(crear-árbol) el árbol está vacío
- anular (creari(e,A1,....Ai)) crear-árbol
- es-vacío-árbol (crear-árbol) true
- es-vacío-árbol (creari (e,A1,...Ai)) false
7TAD ÁRBOL
-
- etiqueta (crear-árbol) el árbol está vacío
- etiqueta (creari (e,A1,...Ai)) e
- etiqueta (hijo-más-izq(creari(e,A1,...Ai)))
etiqueta (A1) - padre (crear-árbol) el árbol está vacío
- padre (creari (e,A1,...Ai)) el elemento no
tiene padre - padre (hijo-más-izq(creari (e,A1,...Ai)))
- creari (e,A1,...Ai))
- Aserto invariante siempre que a la entrada haya
un mensaje , se devolverá como salida el mismo
mensaje.
8Operaciones básicas con árboles binarios
- ESTRUCTURA DEL ÁRBOL
- TYPE
- Ptr POINTER TO nodo
- nodo RECORD
- etiqueta INTEGER
- contadorCARDINAL
- izq,der Ptr
- END
9Operaciones básicas con árboles binarios
-
- PROCEDURE preorden (tPtr)
- BEGIN
- IF t ltgt NIL THEN
- imprimir (t.etiqueta)
- preorden (t.izq)
- preorden (t.der)
- END
- END preorden
10Operaciones básicas con árboles binarios
- PROCEDURE inorden (tPtr)
- BEGIN
- IF tltgtNIL THEN
- inorden (t.izq)
- imprimir (t.etiqueta)
- inorden (t.der)
- END
- END inorden
11Operaciones básicas con árboles binarios
- PROCEDURE postorden (tPtr)
- BEGIN
- IF t ltgt NIL THEN
- postorden (t.izq)
- postorden (t.der)
- imprimir (t.etiqueta)
- END
- END postorden
12Operaciones básicas con árboles binarios
- PROCEDURE localizar (xINTEGERtPtr)Ptr
- BEGIN
- WHILE (t ltgt NIL) AND (t.etiqueta ltgt x) DO
- IF t.etiqueta lt x THEN tt.der
- ELSE tt.izq
- END
- END
- RETURN(t)
- END localizar
13Operaciones básicas con árboles binarios
-
- búsqueda con centinela
-
- PROCEDURE localizar2 (xINTEGERtPtr)Ptr
- BEGIN (utiliza centinela)
- s.etiquetax (centinela )
- WHILE t.etiqueta ltgt x DO
- IF t.etiqueta lt x THEN
- tt.der
- ELSE
- tt.izq
- END
- END
- RETURN (t)
- END localizar2
-
14EJEMPLO DE BÚSQUEDA CON INSERCIÓN
- PROCEDURE Busqueda (xINTEGER VAR pPtr)
- VAR
- qPtr
- BEGIN
- IF pNIL THEN (insertar)
- NEW(q)
- pq
- WITH q DO
- etiquetax
- contador1
- izqNIL
- derNIL
- END
- ELSIF x lt p.etiqueta THEN
- Busqueda(x,p.izq)
- ELSIF x gt p.etiqueta THENBusqueda (x,p.der)
- ELSE
- p.contadorp.contador 1
- END
- END Busqueda
15EJEMPLO DE BÚSQUEDA CON INSERCIÓN
- busqueda e insercion con centinela
- PROCEDURE Busqueda (xINTEGER VAR pPTR)
- VAR
- qPtr
- BEGIN
- IF x lt p.etiqueta THEN
- Busqueda (x,p.izq)
- ELSIF x gt p.etiqueta THEN
- Busqueda (x,p.der)
- ELSIF pltgts THEN ( s es el puntero al centinela
) - p.contadorp.contador 1
-
16EJEMPLO DE BÚSQUEDA CON INSERCIÓN
- busqueda e insercion con centinela
- ELSE
- NEW(q)
- pq
- WITH q DO
- etiquetax
- izqs
- ders
- contador1
- END
- END
- END Busqueda
17ELIMINACION DE UN NODO EN UN ÁRBOL BINARIO
- PROCEDURE Borrar (xINTEGER VAR pPtr)
- VAR
- qPtr
- PROCEDURE Del (VAR rPtr)
- BEGIN
- IF r.der ltgt NIL THEN Del (r.der)
- ELSE
- q.etiquetar.etiqueta
- q.contadorr.contador
- qr
- rr.izq
- END
- END Del
18ELIMINACION DE UN NODO EN UN ÁRBOL BINARIO
- BEGIN (procedimiento Borrar)
- IF pNIL THEN
- WriteString (El elemento no está en el
árbol.) - ELSIF x lt p.etiqueta THEN
- Borrar (x,p.izq)
- ELSIF x gt p.etiqueta THEN
- Borrar (x,p.der)
- ELSE (se borra el elemento p)
- qp
- IF q.derNIL THEN
- pq.izq
- ELSIF q.izqNIL THEN
- pq.der
- ELSE del (q.izq)
- END
- DISPOSE(q)
- END
- END Borrar
19Árboles binarios Hilvanados o Entrelazados
- Recorrido en orden simétrico del árbol
20Árboles binarios Hilvanados o Entrelazados
21Árboles binarios Hilvanados o EntrelazadosRecorr
ido en Orden Simétrico
- ESTRUCTURA DEL ÁRBOL
- TYPE
- Ptr POINTER TO nodo
- nodo RECORD
- etiqueta INTEGER
- izq,der Ptr
- ibit,dbit0..1
- END
22Árboles binarios Hilvanados o EntrelazadosRecorr
ido en Orden Simétrico
- PROCEDURE Ord_Sim (pPtr)
- VAR
- cabezaPtr
- PROCEDURE Sucesor (xPtr)Ptr
- VAR
- sPtr
- BEGIN
- sx.der
- IF x.dbit1 THEN
- WHILE s.ibit 1 DO
- ss.izq
- END
- END
- END Sucesor
- BEGIN (Ord_Sim)
- cabezap
- LOOP
- pSucesor(p)
23Árboles binarios Hilvanados o EntrelazadosRecorr
ido en Orden Simétrico
- PROCEDURE Busqueda (xINTEGER VAR pPtr)
- VAR
- qPtr
- BEGIN
- IF xltp.etiqueta THEN
- IF p.ibit1 THEN
- Busqueda(x,p.izq)
- ELSE (inserión a la izquierda)
- p.ibit1
- NEW(q)
- q.ibit0
- q.dbit0
- q.izqp.izq
- q.derp
- p.izqq
- END
- ELSIF xgtp.etiqueta THEN
- IF p.dbit1 THEN
24 Árboles de búsqueda balanceados
- Árboles binarios de búsqueda (ABB).
- Cada nodo tiene cero, uno o dos hijos,
denominados hijo izquierdo e hijo derecho. - Los hijos de un nodo x con valores menores que x
se encuentran en el subárbol izquierdo y los
mayores en el derecho.
25Árboles de búsqueda balanceados
- Son útiles para realizar búsqueda e inserción en
O(log n) y recorrido ordenado en O(n). - Inconveniente En el peor caso los árboles son
cadenas y la búsqueda necesita O(n).
26Árboles de búsqueda balanceados
- Conclusión Es necesario garantizar que el árbol
está balanceado o equilibrado. - Condición de balanceo basada en número de nodos
o en altura de subárboles.
27 Árboles de búsqueda balanceados
-
- Árbol de búsqueda perfectamente balanceado
- Definición Un AB perfectamente balanceado es un
ABB en el que, para todo nodo, la cantidad de
nodos de su subárbol izquierdo difiere como
máximo en 1 de la cantidad de nodos del subárbol
derecho.
28 Árboles de búsqueda balanceados
3 3
2 3
1 1
2 0
1 1
0 1
0 1
- Resultado
- La búsqueda es O(log n) en el peor caso.
- Pero mantener la condición de balanceo es muy
costoso. La inserción puede ser O(n).
29Árboles de búsqueda balanceados
- Moraleja definir una condición de balanceo, pero
menos exigente. - Definición de árbol balanceado o AVL
(Adelson-Velskii y Landis) un AVL es un ABB em
el que, para todo nodo, la altura de sus
subárboles difiere como máximo en 1.
1 1
1 0
-1 0
0 -1
0 0
30 Árboles de búsqueda balanceados
-
- Operaciones sobre un AVL
- La búsqueda en un AVL es exactamente igual que
sobre un ABB. - La inserción y eliminación son también como en un
ABB, pero después de insertar o eliminar hay que
comprobar la condición de balanceo. - Almacenar la altura de cada subárbol.
- Inserción o eliminación normal (procedimiento
recursivo). - Al volver de la recursividad, en los nodos por
los que pasa, comprobar la condición de balanceo. - Si no se cumple, rebalancear el árbol.
31 Árboles de búsqueda balanceados
- Definición del tipo de datos
- tipo
- ArbolAVLT PunteroNodoAVLT
- NodoAVLT registro
- clave T
- altura entero
- izq, der ArbolAVLT
- finregistro
- operación Altura (A ArbolAVLT) entero
- si A NULO entonces devolver -1
- sino devolver A?altura
- Uso de memoria un puntero más que con una
lista...
32 Peor caso de AVL
- Cuánto será el tiempo de ejecución de la
búsqueda en un AVL en el peor caso, para n nodos? - El tiempo será proporcional a la altura del
árbol. - Cuestión Cuál es la máxima altura del árbol
para n nodos? - Le damos la vuelta a la pregunta Cuál es el
mínimo número de nodos para una altura h?
33 Peor caso de AVL
- N(h) Menor número de nodos para altura h.
34Peor caso de AVL
h-2
h-1
- N(h) N(h-1) N(h-2) 1
- Sucesión parecida a la de Fibonacci.
- Solución N(h) C1,62h ...
35 Peor caso de AVL
- Mínimo número de nodos para altura h N(h)
C1,62h ... - Máxima altura para n nodosh(N) D log1,62 n
... - Conclusión
- En el peor caso, la altura del árbol es O(log n).
- Por lo tanto, la búsqueda es O(log n).
- Inserción y eliminación serán de O(log n) si el
rebalanceo se puede hacer en O(1).
36Rotaciones en un AVL
- Los rebalanceos en un AVL hacen uso de
operaciones conocidas como rotaciones en ABB. - Rotación cambiando algunos punteros, obtener
otro árbol que siga siendo un ABB. - RSD(A). Rotación simple a la derecha de un ABB
B
A
A
B
37 Rotaciones en un AVL
- RSI(A). Rotación simple a la izquierda de un ABB
B
A
A
B
- Programar las operaciones de rotación simple.
38Rotaciones en un AVL
operación RSI (var A ArbolAVLT) B
A?izq A?izq B?der A?der B A?altura
1max(Altura(A?izq), Altura(A?der)) B?altura
1max(Altura(B?izq), A?altura) A B Cuál es
el tiempo de ejecución de una rotación simple?
39 Rotaciones en un AVL
- RDD(A). Rotación doble a la derecha de un ABB
- Es equivalente a RSI(A?der) RSD(A)
A
C
B
A
B
C
40Rotaciones en un AVL
- RDI(A). Rotación doble a la izquierda de un ABB
- Es equivalente a RSD(A?izq) RSI(A)
- Todas las rotaciones mantienen la estructura de
ABB y son O(1).
41Operación de inserción en un AVL
- Inserción normal como en un ABB.
- En cada nodo A (a la vuelta de la recursividad),
si la altura del árbol no se modifica, acabar. - Si la altura se incrementa en 1 entonces
- Si Altura(A?izq) Altura(A?der)gt1 entonces
rebalancear. - Ejemplo.Insertar(1)
8
2 0
RSI(13)
13
3
1 0
23
9
0 -1
42 Operación de inserción en un AVL
- Qué rotación aplicar en cada caso de
desbalanceo? - Se pueden predefinir 4 situaciones diferentes,
cada una asociada con un tipo de rotación.
Caso 1. II(C)
Caso 2. ID(C)
x
x
43Operación de inserción en un AVL
- Qué rotación aplicar en cada caso de
desbalanceo? - Se pueden predefinir 4 situaciones diferentes,
cada una asociada con un tipo de rotación.
Caso 3. DI(C)
Caso 4. DD(C)
x
x
44Operación de inserción en un AVL
Caso 1. II (C)
Solución. RSI (C)
C
A
h
A
C
h-2
h
h-2
h-1
h-2
h-2
h-2
h-2
h-1
x
x
- El árbol resultante está balanceado.
- Adicionalmente, la altura del árbol no cambia.
45 Operación de inserción en un AVL
Caso 2. ID (C)
Solución. RDI (C)
C
B
h
A
C
A
h-2
h
h-2
h-3
B
h-1
h-2
h-2
h-2
h-3
h-1
x
x
x
x
- La altura final del árbol tampoco cambia.
46Operación de inserción en un AVL
operación Inserta (var A ArbolAVLT x
T) si A NULO entonces A NUEVO
NodoAVLT A?clave x A?der A?izq
NULO A?altura 0 sino // Subárbol
izquierdo si x lt A?clave entonces ... sino
// Subárbol derecho si x gt A?clave
entonces ... finsi
Inserta (A?izq, x) si Altura(A?izq)
Altura(A?der)gt1 entonces si x lt A?izq?clave
entonces RSI (A) // Caso II(A) sino
RDI (A) // Caso ID(A) finsi sino
A?altura 1max( Altura(A?izq),
Altura(A?der)) finsi
47Operación de inserción en un AVL
- El procedimiento sigue recursivamente hasta la
raíz. - Pero cuando se haga el primer balanceo no será
necesario hacer otros balanceos. Por qué? - Ejemplo Dado un árbol nuevo insertar 4, 5, 7, 2,
1, 3, 6. - Cuál es el orden de complejidad del algoritmo de
Inserta?
48Operación de inserción en un AVL
- TYPE
- Balanceo-1..1
- PtrPOINTER TO nodo
- nodoRECORD
- etiquetaINTEGER
- contadorINTEGER
- izq,der Ptr
- END
- PROCEDURE Busqueda (xINTEGER VAR pPtr
hBOOLEAN) - ( h indica si ha aumentado la altura del
árbol ) - VAR
- q,p1,p2Ptr
- BEGINIF pNIL THEN NEW(q)
- pq
- hTRUE
- WITH pDO
- etiquetax
- contador1
49Operación de inserción en un AVL
- ELSIF p.etiqueta gt x THEN
- Busqueda (x,p.izq,h)
- IF h THEN CASE p.bal OF
- 1 p.bal0
- hFALSE
- 0 p.bal-1
- -1 (rebalanceo)
- p1p.izq
- IF p1.bal-1 THEN (rotac. LL)
- p.izqp1.der
- p1.derp
- p.bal0
- ELSE (rotación doble LR )
- p2p1.der
- p1.derp2.izq
- p2.izqp1
- p.izqp2.der
- p2.derp
- IF p2.bal-1 THEN
50Operación de inserción en un AVL
- ELSIF p.etiqueta lt x THEN
- Busqueda(x,p.der,h)
- IF h THEN (la rama derecha creció)
- CASE p.bal OF
- -1 p.bal0
- hFALSE
- 0 p.bal1
- 1 (rebalanceo)
- p1p1.der
- IF p1.bal1 THEN (rotación
RR) p.derp1.izq - p1.izqp
- p.bal0
- pp1
- ELSE (rotación doble RL)
- p2p1.izq
- p1.izqp2.der
- p2.derp1
- p.derp2.izq
- p2.izqp
51Operación de eliminación en un AVL
- La eliminación de un nodo es algo más compleja.
Hay más casos y puede ser necesario balancear a
varios niveles. - Algoritmo de eliminación Eliminación normal en
ABB comprobación de la condición. - Eliminación normal en un ABB. Buscar el elemento
a eliminar en el árbol. - Si es un nodo hoja se elimina directamente.
- Si el nodo eliminado tiene un solo hijo, conectar
el padre del nodo eliminado con ese hijo. - Si el nodo eliminado tiene dos subárboles,
escoger el nodo más a la derecha del subárbol
izquierdo (o el más a la izquierda del subárbol
derecho).
52Operación de eliminación en un AVL
53 Operación de eliminación en un AVL
- Después de eliminar un nodo, volver a los nodos
antecesores (recursivamente). - Comprobar si cumple la condición de balanceo.
- En caso negativo rebalancear.
- Se pueden predefinir 3 casos de eliminación en
subárbol izquierdo, y los simétricos en subárbol
derecho.
A
Ojo Los casos de desbalanceo en
subárbol izquierdo de A dependen de las alturas
h1 y h2 en el subárbol derecho.
C
h2
h1
54Operación de eliminación en un AVL
Caso 1. h1h2
Solución. RSD (A)
C
A
h
A
C
h
h-3
h-2
h-1
h-2
h-2
h-1
h-3
h-2
- El árbol resultante está balanceado.
- La altura del árbol no cambia.
55Operación de eliminación en un AVL
Caso 2. h1lth2
Solución. RSD (A)
A
C
h
C
A
h-2
h-1
h-3
h-2
h-3
h-2
h-1
h-3
h-3
- En este caso, la altura del árbol disminuye en 1.
56Operación de eliminación en un AVL
Caso 3. h1gth2
Solución. RDD (A)
A
B
C
C
A
B
h-2
- Comprobar (mediante el cálculo de las alturas)
que el árbol resultante está balanceado. - La altura final del árbol disminuye en 1.
57 Operación de eliminación en un AVL
- Ejercicio implementar la operación de
eliminación en un AVL. - Cuál es el orden de complejidad?
- Ejemplo Dado el siguiente AVL, eliminar las
claves 4, 15, 32, 45.
58Operación de eliminación en un AVL
- Procedure BalanceI(VAR pPtr VAR hBOOLEAN)
- VAR
- p1,p2Ptr
- b1,b2Balanceo
- BEGIN (la rama izquierda ha crecido)
- CASE p.bal OF
- -1 p.bal0
- 0 p.bal1 hFALSE
- 1 p1p.der b1p1.bal
- IF b1 gt0 THEN (rotación
simple RR) - p.derp1.izq p1.izqp
- IF b10 THEN
- p.bal1p1.bal-1 hFALSE
- ELSE
- p.bal0 p1.bal0
- END
- pp1
- ELSE (rotación doble RL)
- p2p1.izq b2p2.bal
59Operación de eliminación en un AVL
- PROCEDURE BalanceD (VAR pPtr VAR hBOOLEAN)
- VAR
- p1,p2Ptr b1,b2Balanceo
- BEGIN (la rama derecha ha encogido)
- CASE p.bal OF
- 1 p.bal0
- 0 p.bal-1 hFALSE
- -1 (rebalanceo)
- p1p.izq b1p1.bal
- IF b1lt0 THEN (rotación simple LL)
- p.izqp1.der p1.derp
- IF b10 THEN
- p.bal-1 p1.bal1 hFALSE
- ELSE
- p.bal0 p1.bal0
- END
- pp1
- ELSE (rotación doble LR )
- p2p1.der b2p2.bal
60Operación de eliminación en un AVL
- PROCEDURE Borrar (xINTEGER VAR pPtr VAR
hBOOLEAN) - VAR
- qPtr
- PROCEDURE del(VAR rPtr VAR hBOOLEAN)
- BEGIN
- IF r.der ltgt NIL THEN
- del(r.der,h)
- IF h THEN BalanceD(r,h) END
- ELSE
- q.etiquetar.etiqueta
- q.contadorr.contador
- qr rr.izq hTRUE
- END
- END del
- BEGIN (Borrar)
- IF pNIL THEN
- WriteString(El elemento no está en el
árbol.) - ELSIF p.etiqueta gt x THEN
- Borrar(x,p.izq,h)
61 Árboles de búsqueda balanceados
- Conclusiones
- La idea de los árboles binarios de búsqueda está
muy bien. - Pero para que funcionen en todos los casos es
necesario introducir condiciones de balanceo. - ABB sin balanceo mal eficiencia en peor caso.
- Balanceo perfecto costoso mantenerlo.
- AVL Todos los casos están en O(log n) y el
balanceo es poco costoso.