Grafos.
Cada elemento puede estar enlazado a cualquier otro.
A
B
B
E
rboles
Estructura no lineal jerrquica en la que cada
elemento tiene un nico antecesor y puede tener
varios sucesores.
Terminologa
Nodo: los vrtices o elementos de un rbol.
Enlace/arco/arista: Conexin entre dos nodos
consecutivos.
Los nodos pueden ser:
Nodo raz: nodo superior de la jerarqua.
Nodo terminal u hoja: nodo que no contienen ningn subrbol.
Nodos interiores: nodos con uno o ms subrboles; nodos que no
son hojas.
Descendientes o hijos: cada uno de los subrboles de un nodo.
Ascendiente, antecesor o padre: nodo de jerarqua superior a
uno dado.
Nodos hermanos: nodos del mismo padre.
Terminologa (II)
Camino: enlace entre dos nodos.
No existe un camino entre todos los
nodos.
Nivel 0
Nivel 1
H
Nivel 2
Nivel 3
rboles binarios
Un rbol general sera un rbol en el que cada nodo puede tener un
nmero ilimitado de subrboles.
Un rbol binario sera un conjunto de 0 o ms nodos en el cual existe
un nodo raz y cada uno de los nodos, incluido el raz podrn tener 0, 1
o dos subrboles:
Subrbol izquierdo y subrbol derecho.
Cada nodo es como mximo de grado 2.
Terminologa:
rboles similares: rboles con la misma estructura.
rboles equivalentes: rboles con la misma estructura y contienen la
misma informacin.
rboles completos o rboles perfectos: todos los nodos, excepto las
hojas, tienen grado 2.
Un rbol binario de nivel n tiene 2n-1 nodos.
10
11
12
13
C
Nivel 0
A
D
Nivel 1
Nivel 2
Nivel 3
14
J
L
M
9
-1
rbolB
14
12
10
11
12
10
13
11
rbolB
rbolA
-1
2
3
15
raz hder
-1
14
15
15
const
MaxArbol =
tipos
= TipoElemento
entero = rbol
registro = nodo
TipoElemento = raz
rbol = hizq, hder
fin_registro
array[1..MaxArbol] de nodo = almacenamiento
var
almacenamiento : alm
rbol : a
16
17
nodo
raz
hizq hder
rbolA
A
C
/
tipos
= TipoElemento
puntero_a nodo = rbol
registro = nodo
TipoElemento = raz
rbol = hizq, hder
fin_registro
var
rbol : a
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2012
E
/
F
/
G
/
18
Recorridos en anchura.
Se accede a los nodos hermanos en cada uno de los niveles del rbol.
19
20
Recorrido inorden.
Por cada elemento no vaco:
Recorrido postorden.
Por cada elemento no vaco:
21
P
/
H
/
A
/
R
/
E
/
Q
/
Z
/
Recorrido preorden: M F C A E H P R Q Z
22
P
/
H
/
A
/
R
/
E
/
Q
/
Z
/
Recorrido inorden: A C E F H M P Q R Z
23
P
/
H
/
A
/
R
/
E
/
Q
/
Z
/
Recorrido postorden: A E C H F Q Z R P M
24
Recorrido en anchura
El recorrido se hace por niveles a partir del nivel 0.
Por cada nivel se recorren los nodos hermanos de izquierda a derecha.
rbol
M
P
/
H
/
A
/
R
/
E
/
Q
/
Z
/
Recorrido en anchura: M F P C H R A E Q Z
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2012
25
26
var
cola : niveles
rbol : aux
inicio
ColaNueva(niveles)
CInsertar(niveles,a)
repetir
Primero(niveles, aux)
CBorrar(niveles)
si aux <> nulo entonces
//Procesar riz
escribir(a.raz)
CInsertar(niveles, a.hizq)
CInsertar(niveles, a.hder)
fin_si
hasta_que EsColaVaca(niveles)
fin_procedimiento
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2012
27
Aplicaciones de rboles
En una lista enlazada slo hay una forma de insertar o de
eliminar un elemento:
Para insertar un elemento hay que colocarlo entre al anterior y el
siguiente.
Para eliminar un elemento, hay que hacer que el anterior apunte al
siguiente.
28
rboles de expresiones
Representacin de una expresin.
Los nodos internos son los operadores y las hojas los operandos.
Si hay varias operaciones, las de menos prioridad ocupan los niveles ms
altos.
Sea la expresin: (a+b) * (c/(d+f))
rbol
*
a
/
b
/
c
/
+
/
d
/
f
/
29
30
M
D
C
P
F
Y
S
31
Casos generales.
Si el elemento es menor que el raz hay que hacer la bsqueda en el subrbol izquierdo
(llamada recursiva).
Si el elemento es mayor, hay que hacer la bsqueda en el subrbol derecho (llamada
recursiva).
32
Bsqueda iterativa
rbol : funcin Buscar(valor rbol : a; valor TipoElemento : e)
var
lgico : encontrado
inicio
encontrado falso
mientras no encontrado y (a <> nulo) hacer
si a.raz = e entonces
encontrado verdad
si_no
si a.raz > e entonces
a a.hizq
si_no
a a.hder
fin_si
fin_si
fin_mientras
si encontrado entonces
devolver(a)
si_no
devolver(nulo)
fin_si
fin_funcin
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2012
33
Bsqueda recursiva
Funciona de forma similar a la bsqueda binaria recursiva.
Si
Si
Si
Si
el
el
el
el
34
35
a aux
M
/
ant.hizq aux
aux
aux
ant.hder aux
C
M
/
D
/
act
/
N
/
V
/
ant
E
/
ant
F
act
R
/
Y
/
aux
R
/
aux
36
37
Caso general.
Si el rbol no est vaco.
o Si el elemento a insertar es menor que el elemento raz, se inserta en el
subrbol izquierdo.
o Si el elemento a insertar es mayor que el elemento raz, se inserta en el
subrbol derecho.
38
39
40
Borrado de un nodo
Al algoritmo de borrado de un nodo debemos suministrarle la
direccin del nodo a borrar (act) y la direccin del nodo anterior
(ant).
Si queremos borrar el elemento raz, ant ser nulo.
Dependiendo del valor del nodo anterior habr que tomar distintas
decisiones.
Caso 1: Borrar una hoja.
Caso 1a: borrar el ltimo nodo de un rbol de un nico elemento.
El rbol toma un valor nulo.
a
a nulo
ant
M
/
act
ant
M
/
act
/
41
ant.hizq nulo
a
M
ant
ant
D
act
act
C
/
F
/
C
/
F
/
42
a
M
ant
ant
/
C
/
F
/
C
/
act
F
/
act
43
a a.hder
ant
ant
act
act
Q
/
R
/
Q
/
44
ant.hder act.hder
M
P
ant
ant
act
act
Q
/
V
/
R
/
/
45
a
M
ant
act
ant
D
/
E
/
ant.hizq act.hder
G
/
G
/
/
46
47
48
act
ant
act
act
act
aux
H
O
/
ant
K
ant
O
aux
/
M
O
/
aux
/
M
ant
act
R
/
aux
49
50
51
52
Borrado recursivo
Se puede simplificar el borrado iterativo utilizando una
solucin recursiva.
El procedimiento, en este caso buscara el nodo y si lo
encuentra, lo elimina.
Caso base.
Existen dos casos base:
Si el rbol es nulo, el elemento no existe.
Si el elemento a borrar no es menor ni mayor que el elemento raz (si
se encuentra), se borra el nodo.
Caso general.
Dos llamadas recursivas:
Si el elemento a borrar es menor que el raz, hay que borrar en el
subrbol izquierdo.
Si el elemento a borrar es mayor que el raz, hay que borrar en el
subrbol derecho.
53
Borrado recursivo
El borrado del nodo slo presentara tres casos:
Si es una hoja: el predecesor sera nulo (figura A de la
dispositiva siguiente).
Si tiene un nico subrbol, el predecesor tendr que apuntar al
nico hijo de dicho rbol (figura B de la dispositiva siguiente).
Si tiene dos hijos, se redistribuyen los nodos para que los nodos
restantes mantengan la estructura de rbol binario se bsqueda:
Se sube a la posicin del nodo a borrar, el contenido del nodo del
elemento mayor del subrbol izquierdo.
Se elimina el nodo situado ms a la derecha del subrbol izquierdo
(el que se ha subido).
Para este proceso se realizar una llamada a otro procedimiento
recursivo que sustituir el valor del nodo a borrar.
54
55
56
57
Ejemplos
Disee una funcin que devuelva la altura de un rbol.
entero : funcin Altura(valor rbol : a)
inicio
si a <> nulo entonces
devolver(1 + MayorAltura(Altura(a.hizq),Altura(a.hder))
si_no
devolver(0)
fin_si
fin_funcin
entero funcin MayorAltura(E entero : a,b)
inicio
si a > b entonces
devolver(a)
si_no
devolver(b)
fin_si
fin_funcin
58
Ejemplos (II)
Disee un procedimiento que copie un rbol
procedimiento Copiar(valor rbol : a; ref rbol : c)
inicio
si a <> nulo entonces
reservar(c)
c.raz a.raz
Copiar(a.hizq, c.hizq)
Copiar(a.hder, c.hder)
si_no
c nulo
fin_si
fin_procedimiento
59
Ejemplos (III)
Una funcin que compruebe si dos rboles son similares.
Si los dos no son nulos, son similares si al subrbol derecho y el izquierdo son
similares.
Si los dos son nulos, son similares.
Si uno es nulo y el otro no, no son similares.
lgico:funcin SonSimilares(valor arbol: a1,a2)
inicio
si (a1 <> nulo) y (a2 <> nulo) entonces
devolver(SonSimilares(a1.hizq,a2.hizq) y SonSimilare(a1.hder,a2.hder))
si_no
devolver((a1 = nulo) y (a2 = nulo))
fin_si
fin_funcin
60
Ejemplos (IV)
Una funcin que comprueba si dos rboles son equivalentes.
Si los dos no son nulos y la informacin es la misma, son equivalentes si al subrbol derecho
y el izquierdo son equivalentes.
Si la raz es distinta no son equivalentes
Si los dos son nulos, son equivalentes.
Si uno es nulo y el otro no, no son equivalentes.
61
Ejemplos (V)
Disee un algoritmo que calcule el nmero de nodos de un rbol.
Si el rbol est vaco, el nmero de nodos es 0,
Si no est vaco, al menos tiene un nodo y, adems puede tener ms
nodos a la izquierda o a la derecha.
entero funcin NmeroDeNodos(valor arbol: a)
inicio
si a = nulo entonces
devolver(0)
si_no
devolver(1 + NmeroDeNodos(a.hizq) + NmeroDeNodos(a.der))
fin_si
fin_funcin
62
Ejemplos (VI)
Disee un algoritmo que devuelva el peso de un rbol.
Si el rbol est vaco, el peso es 0.
Si el hijo izquierdo y el hijo derecho del rbol son nulos, el peso es 1.
Si no, el peso ser la suma de los pesos de sus dos hijos.
entero funcin Peso(valor arbol: a)
inicio
si a = nulo entonces
devolver(0)
si_no
si (a.hizq = nulo) y (a.der = nulo) entonces
devolver(1)
si_no
devolver(Peso(a.hizq) + Peso(a.der))
fin_si
fin_si
fin_funcin
63
Ejercicios (VII)
1. Se tiene almacenado en un rbol binario de bsqueda
una serie de nmeros ordenados de menor a mayor.
Disee un procedimiento que devuelva los nmeros
pero ordenados de mayor a menor.
2. Se tiene almacenada una frase en un archivo de texto.
Disee un algoritmo que almacene las palabras de la
frase en un rbol binario de bsqueda. Las palabras del
rbol no se podrn repetir y en cada nodo se
almacenar la palabra y el nmero de veces que
aparece en la frase. El algoritmo deber mostrar por
pantalla las palabras ordenadas por la frecuencia de
aparicin.
64
Ejercicios (VIII)
3. En un archivo directo se tiene almacenada informacin sobre una
serie de automviles. Por cada registro del archivo aparece la
matrcula (campo clave), la marca y el modelo y el DNI del
propietario. Los registros estn distribuidos de forma aleatoria por
el archivo que tiene una capacidad para 1000 vehculos. Disee un
algoritmo que cree un ndice del archivo en un rbol binario de
bsqueda. Cada nodo del rbol deber almacenar la matrcula y el
nmero de registro relativo del archivo donde est almacenado el
vehcuclo.
A partir de este ndice disee los procedimientos para:
Realizar un listado con todos los datos de los vehculos del archivo.
Sacar por pantalla los datos de un vehculo cuya matrcula se introduce por
teclado.
Realizar la insercin de un nuevo vehculo en el archivo, insertando
tambin la informacin necesaria en el ndice.
Realizar la eliminacin de un vehculo en el archivo.
65