Professional Documents
Culture Documents
rboles
rboles binarios
rboles binarios de bsqueda
rboles AVL
Ivn Cantador
David Vallet, Jos R. Dorronsoro
Escuela Politcnica Superior
Contenidos
Grafos. Definicin
rboles
rboles binarios
rboles binarios de bsqueda
rboles AVL
2
6
4
1
5
V= {1, 2, 3, 4, 5, 6}
R= {(1,4), (1,5), (1,6), (2,3),, (5,1), (6,2)}
Grafos. Caminos
Ejemplo
Nodos
terminales
(hojas)
raz
rboles. Definicin
7
1
V= {1, 2, 3, 4, 5, 6}
R= {(1,4), (1,5), (1,6), (2,3),, (5,1), (6,2)}
Caminos: {1, 6, 2, 3}, {5, 1, 4},
6
9
9
7
6
10
10
Ejemplo
1
T
2
6
9
7
10
Nodos
intermedios
9
7
1
2
10
rboles. Sub-rboles
10
altura(T) = 1 + 3 = 4
profundidad(1) = 0
profundidad(5) = 1
profundidad(7) = 3
rbol equilibrado
Contenidos
rboles
rboles binarios
rboles binarios de bsqueda
rboles AVL
10
Ejemplo
raz
raz
padre
de X
X
nodos
intermedios
hojas
hojas
hijo
izquierdo
de X
hijo
derecho
de X
11
12
raz
sub-rbol
izquierdo
13
sub-rbol
izquierdo
sub-rbol
derecho
6
2
5
4
Recorrido en achura
recorrido por nivel
Ejemplos de aplicacin (en grafos): camino ms corto entre
dos nodos, crawling Web
14
Ejemplo
visitar = printf del contenido de un nodo
resultado: C A B F E D G
F
B
E
D
15
16
Algoritmo recursivo
Pseudocdigo
abPrerden(ArbolBinario T) {
// rbol vaco
si abVacio(T) == TRUE
volver
else
visitar(T) // printf
abPreorden(izq(T))
abPreorden(der(T))
volver
}
3
1
Ejemplo
6
2
Observaciones
Pseudocdigo compacto
abPostorden(ArbolBinario T) {
// rbol no vaco
si abVacio(T) == FALSE:
si abVacio(izq(T)) == FALSE:
abPostorden(izq(T))
si abVacio(der(T)) == FALSE:
abPostorden(der(T))
visitar(T)
}
E
D
Pseudocdigo ms eficiente
F
B
abPostorden(ArbolBinario T) {
// rbol no vaco
si abVacio(T) == FALSE:
abPostorden(izq(T))
abPostorden(der(T))
visitar(T)
}
3
1
6
2
5
4
Ejemplo
7
F
B
E
D
19
20
21
Pseudocdigo compacto
abInorden(ArbolBinario T) {
// rbol no vaco
si abVacio(T) == FALSE:
abInorden(izq(T))
visitar(T)
abInorden(der(T))
}
3
1
Pseudocdigo ms eficiente
abInorden(ArbolBinario T) {
// rbol no vaco
si abVacio(T) == FALSE:
si abVacio(izq(T)) == FALSE:
abInorden(izq(T))
visitar(T)
si abVacio(der(T)) == FALSE:
abInorden(der(T))
}
6
2
Ejemplo
A
F
B
E
D
resultado: C A F B E G D
22
23
Ejemplo
Pseudocdigo
Recorre de arriba abajo y de izquierda a derecha
Nunca recorre un nodo de nivel i sin haber visitado los de nivel
i -1
abAnchura(ArbolBinario T) {
colaInicializar(Q)
colaInsertar(Q, T)
mientras colaVacia(Q) == FALSE:
colaExtraer(Q, T)
visitar(T)
para cada hijo H de T:
colaInsertar(Q, H)
}
abAnchura(ArbolBinario T) {
colaInicializar(Q)
colaInsertar(Q, T)
mientras colaVacia(Q) == FALSE:
colaExtraer(Q, T)
visitar(T)
para cada hijo H de T:
colaInsertar(Q, H)
}
Q
C
C
A
F
B
D
Estructura de Datos y Algoritmos
Escuela Politcnica Superior
Universidad Autnoma de Madrid
VISITAR
AF
FB
BEG
EG
7D
D
Estructura de Datos y Algoritmos
Escuela Politcnica Superior
Universidad Autnoma de Madrid
24
25
operador
AdE1
+
A
AdE2
/
D
(D/E)
(A+B) (C-(D/E))
((A+B)*(C(D/E)))
26
27
*
+
Construccin de un AdE
/
D
Salida: A B + C D E / - *
Forma posfijo/sufijo de la expresin
*
E
(A + B)
((A + B) * (C (D / E)))
(A + B) (C-(D / E))
*
(A+B)
Salida: * + A B C / D E
Forma prefijo de la expresin
+
A
C
D
C (D / E)
28
29
Ejemplo 1: A B + C D E / - *
Construccin de un AdE
Pila
Smbolo
A, B
A
B
+
B
+
C, D, E
30
Ejemplo 1: A B + C D E / - *
31
Ejemplo 2: (A + B C) * (D ^ (E / F)) A B + C D E F / ^ *
+
A
-, D, E, F, /
/
D
^
-
/
D
+
A
*
+
/
D
A, B, +, C
Pila
Smbolo
Pila
Smbolo
A
Estructura de Datos y Algoritmos
Escuela Politcnica Superior
Universidad Autnoma de Madrid
/
E
32
Pila
*
*
^
C D
+
A
33
Ejemplo 2: (A + B C) * (D ^ (E / F)) A B + C D E F / ^ *
Smbolo
/
E
info
izq
der
34
35
3
1
5
5
36
NodoAB *abCrearNodo() {
NodoAB *pn = NULL;
pn = malloc(sizeof(NodoAB));
if (!pn) return NULL;
izq(pn) = der(pn) = NULL;
return OK;
}
38
37
// Recorrido postorden
39
40
Profundidad de un rbol
T
25
43
profundidad(T)= 1
profundidad(T)= 3
(la mayor profundidad de todas
las hojas)
43
32
1= 21 1
25
22= 4
3 = 22 1
7 = 23 1
6
2
29
42
Contenidos
43
AB casi completo
Todos los niveles con profundidad d < p estn completos, i.e.
tienen 2d nodos
AB completo
Todos los niveles con profundidad d p estn completos, i.e.
tienen 2d nodos
(casi completo y tiene exactamente 2p hojas a profundidad p)
no completo
4
3
3
1
21 = 2
43
12
6
2
1
25
20= 1
profundidad(T)= 0
T 25
41
profundidad(T)= -1
T 25
casi
completo
completo
4
3
6
7
rboles
rboles binarios
rboles binarios de bsqueda
rboles AVL
6
2
44
45
Salida => 1 2 3 4 5 6 7
Listado ordenado de los nodos!
6
2
1
7
46
25
43
12
12
43
7
25
25
43
12
32
43
12
7
32
29
43
5
4
25
6
2
47
48
49
Cdigo C
Pseudocdigo
status abdbInsertar(ArbolBinario T, dato d)
si abVacio(T)
// Caso base
T = abCrearNodo()
si (T == NULL) devolver ERROR
info(T) = d
devolver OK
// Caso general
else
si info(T) < d
devolver abdbInsertar(izq(T), d)
else
devolver abdbInsertar(der(t), d)
43
32 3: comparar(32, 32)!
29
Bsqueda de 33?
- Se hacen llamadas recursivas hasta llegar a un rbol vaco
51
52
Pseudocdigo
a lo sumo p accesos
O(n)
O(log(n))
Pseudocdigo
status abdbExtraer(ArbolBinario T, dato d)
si abVacio(T) == TRUE
devolver ERROR
T = abdbBuscar(T, d)
if T == NULL
devolver OK
else
devolver abdbReajustar(T)
O(n2)
O(n*log(n))
Estructura de Datos y Algoritmos
Escuela Politcnica Superior
Universidad Autnoma de Madrid
55
56
57
Ejemplo: abdbExtraer(T, 2)
T
5
4
58
1. La raz de T es hoja
2. La raz de T tiene 1 hijo
3. La raz de T tiene 2 hijos: buscar sucesor de T, guardar
info del sucesor en T, extraer sucesor
6
2
2
5
4
Estructura de Datos y Algoritmos
Escuela Politcnica Superior
Universidad Autnoma de Madrid
El sucesor de T se obtiene:
1. Bajando a la derecha de T un nivel
2. Bajando a continuacin a la izquierda
hasta el ltimo nivel (nodo hoja)
Ejemplo: abdbExtraer(T, 3)
Ejemplo: abdbExtraer(T, 1)
3
59
1. La raz de T es hoja
2. La raz de T tiene 1 hijo: reajustar puntero del padre de T al
hijo de T, eliminar de T
3. La raz de T tiene 2 hijos
6
2
5
4
1
7
6
2
5
4
1
7
sucesor de T
6
2
1
2
3
5
6
Contenidos
62
63
fe(T)=profundidad(izq(T))profundidad(der(T))
rboles
rboles binarios
rboles binarios de bsqueda
rboles AVL
2
fe(1)=0
fe(2)=-2
fe(5)=1
fe(6)=0
fe(4)=1
fe(3)=0
64
65
RI = rotacin izquierda
RD = rotacin derecha
RID = rotacin izquierda + rotacin derecha
RDI = rotacin derecha + rotacin izquierda
fe(A)
fe(B)
Rotacin
-2
-2
Proposicin:
- Si T es un rbol AVL con N nodos, entonces:
profundidad(T) = O(log2N)
-2
-1
-2
A
B
2
1
RI(B)
-1
B
2
RD(B)
-1
B
A
B
-2 A
-2 A
B 1
A
B 1
RDI(izq(B))
-1
-1
RID(der(B))
-1
66
Insercin de 2
-1
1
0
2
Insercin de 3
-2
-1
2
RI(2)
0
0
1
67
Construccin de un AVL
B
B
A 2
A 2
68
-1
Insercin de 4
Insercin de 7
-1
1
69
-1
0
4
-2
2
RI(6)
-1
6
0
2
-1
Insercin de 15
-2
Insercin de 5
-1
-2
1
RI(4)
-1
4
0
4
0
3
-1
2
-1
0
15
-2
Insercin de 14
-2
Insercin de 6
-2
-1
1
-1
RI(4)
5
-1
2
0
0
-2
2
70
1
0
-1
4
14
-2
-2
2
13
-1
2
0
5
14
13
15
0
3
0
0
5
0
14
0
13
0
15
15
0
1
0 0
3
13
1
0
12
13
12
1
6
0 0
3
11
14
10
13
-1
1
4
12
0 0
3
15
0
1
-1
4
11
10
13
0
15
0
1
0
4
RD(10) 0
14
12
1
6
0 0
3
10
0
9
14
0 0
11
0 0
3
-1
12
0
11
13
0
1
1
4
15
14
-1
12
1
6
0 0
3
10
1
0
14
0 0
11
13
0
15
11
0
15
10
Insercin de 8
RD(12)
14
15
0
4
RD(12) 0
12
11
15
12
-1
2
0
0
0 0
3
14
12
Insercin de 11
0
14
0
15
71
2
4
13
15
-1
14
1
4
Insercin de 9
RI(7)
1
0
14
-2
0
0
-2
15
13
Insercin de 12
-1
14
0
7
RDI(7)
-1
2
14
-2
15
-2
-2
2
0
1
RDI(14)
-2
Insercin de 13
-1
13
0
15
Ivn Cantador
David Vallet, Jos R. Dorronsoro
Escuela Politcnica Superior