Vous êtes sur la page 1sur 69

Estructuras de Datos

Ingeniera Tcnica Informtica de Gestin

TEMA 5: rboles (parte I)


Trie, genricos y binarios

Contenido

Introduccin y Definiciones.
Un tipo especial de rbol: el rbol Trie

El TAD rbol

Representacin hijo izquierdo-hermano derecho

rboles binarios

Representacin de Tries
Evaluacin de Tries

El TAD rbol binario

Introduccin

Un rbol es una estructura de datos no lineal


Se apoya sobre una relacin binaria de orden NO necesariamente
total:

Es decir, existen elementos que no son comparables entre s.

Realmente las estructuras de datos lineales podran verse como


un caso muy particular de las estructuras de datos rboreas.

Ej: (N2,<), donde N={0,1,2,,n,} para todo X=(a,b), Y=(c,d) en N2,


definimos la relacin <, de tal forma que X<Y sii a < c.
Al representar grficamente el retculo de esta relacin observamos que
los elementos YA NO se pueden disponer en una lnea sino que forman
una estructura ms general, una estructura con ramificaciones.

Informalmente, una estructura lineal sera un rbol sin ramificaciones.

Introduccin

Los rboles se aplican en mltiples campos de la informtica:

ingeniera del conocimiento en I.A. (ej: espacio de bsqueda de una


partida del juego de las damas), rboles de decisin, representando
expresiones lgicas (lenguajes de programacin declarativos PROLOG-), expresiones aritmticas, expresando ontologas (web
semntica), en compilacin de programas (rbol de derivaciones
sintcticas de un programa), etc.
p

Estructura rbol:

Almacenando en memoria la
expresin lgica p( f(a, b), a).

a
b

Definiciones bsicas

rboles como grafos particulares:

Es un grafo no dirigido , acclico y conexo.

Grafo

Posee ciclos

Bosque

No conexo

rbol

Definiciones bsicas: caracterizacin


topolgica de un rbol

Caracterizacin de un rbol: si G=(V,A) es un grafo no


dirigido, las siguientes proposiciones son
equivalentes:
1.
2.
3.
4.
5.
6.

G es un rbol
Cualquier par de vrtices est conectado por un nico camino
G es conexo pero si se elimina cualquier arista de A, el grafo
es no conexo
G es conexo y tiene |V|-1 aristas
G es acclico y tiene |V|-1 aristas
G es acclico, pero si se aade una arista se forma un ciclo.

Definiciones bsicas: caracterizacin


topolgica de un rbol

Las propiedades topolgicas de un rbol en particular y un grafo


en general pueden ser utilizadas para demostrar propiedades y
teoremas sobre estos objetos que a la postre se traducirn en
algoritmos de gran aplicabilidad. Adems, las propiedades de
estos objetos pueden ser explotadas tambin para optimizar la
formulacin del algoritmo (vase cualquier tratado sobre teora de
grafos).
Para demostrar la equivalencia de un conjunto de proposiciones,
la estrategia a seguir suele ser demostrar la implicacin por
pares: (1) (2),,(5) (6) y finalmente (6) (1). As, decir que
un grafo es un rbol es equivalente a decir que dicho grafo es
conexo y posee |V|-1 aristas por ejemplo.
Cuestin: Justifique intuitivamente la equivalencia de las
proposiciones anteriores.

Definiciones bsicas

Nodo raz: aunque el rbol sea un grafo no dirigido, interesa fijar


un nodo especial (de partida) a partir del cual iniciar los recorridos
sobre la estructura.
Si (x,y) es el ltimo arco en el camino desde la raz r de un rbol T
hasta el nodo y, entonces

Los nodos de un rbol se clasifican en:

El nodo x es padre del nodo y, y el nodo y es hijo del nodo x.


A los nodos con el mismo padre se les denomina nodos hermanos.
La raz es el nico nodo del rbol sin padre.
Internos: nodos con descendientes (con hijos)
Hojas: nodos sin descendientes (sin hijos)

Definiciones bsicas

El grado de un nodo es el nmero mximo de hijos que tiene.


El grado de un rbol se corresponde con el mximo del grado de
sus nodos.

La profundidad de un nodo es la longitud (n de aristas) desde la


riz hasta el nodo.
La altura de un rbol es la profundidad del nodo ms profundo
(profundidad del rbol).
El nivel de un nodo es su profundidad+1.

rboles n-arios: rboles de grado n (mximo de n hijos por nodo)


rboles binarios: rboles de grado 2 (mximo de 2 hijos por nodo)

Cuestin: Cul ser el nivel del nodo raz?

Definiciones bsicas: caracterizacin


computacional de un rbol

La estructura de datos rbol se puede definir recursivamente:

T es un rbol vaco si no tiene ningn nodo.


Si un grafo tiene un nodo, dicho grafo es un rbol y el nodo es el
nodo raz.
Si T es un rbol con ms de un nodo, entonces los descendientes de
T son a su vez nodos raz de los subrboles que cuelgan de T.

Por lo tanto, un rbol es una estructura recursiva.

10

Es decir, al eliminar el nodo raz de un rbol obtenemos un bosque de


rboles.

Una estructura recursiva suele conducir a propiedades que se


definen recursivamente.
Aunque esto no signifique que la implementacin de dichas
propiedades sea recursiva. Si se puede, deberan ser iterativas.

rboles Trie

11

Aplicacin: representacin de diccionarios (o en


general conjuntos) grandes de palabras.
Ejemplo. Corrector ortogrfico interactivo.

rboles Trie

Diccionario espaol: ~ 3 millones de palabras.


Muchas palabras Mucha memoria y operaciones
lentas.
Pero la bsqueda de una palabra no puede tardar ms
de 1 milisegundo...
... esparto esparvar esparvel esparver espasmar espasmo
espasmdica espasmdico espata espatarrada espatarrarse
esptica esptico espato esptula espatulomancia espaviento
espavorecida espavorecido espavorida espavorido espay
especera especia especial ...

12

rboles Trie

13

Idea: muchas palabras tienen prefijos comunes. P. ej.:


espasmar, espasmo, espasmdico, espasmdica, ...

rboles Trie

14

Un Trie es, bsicamente, un rbol de prefijos.


Sea A un alfabeto. Por ejemplo A= {a, b, c, ..., z}
Aadimos a A una marca de fin de palabra: $.
Definicin: un Trie es una estructura de rbol en la que:
1. La raz del rbol representa la cadena vaca.
2. Un nodo puede tener tantos hijos como caracteres del alfabeto
A ms uno. Cada hijo est etiquetado con un carcter o una
marca de fin $.
3. La sucesin de etiquetas desde la raz hasta un nodo hoja,
etiquetado con la marca de fin $, representa una palabra.
4. A todos los nodos, excepto a la raz y a las hojas etiquetadas
con $, se les denomina prefijos del rbol.

rboles Trie

15

Ejemplo, C= {ELLA, ELLO, EL, TU, Y, YO}


Cmo usarlo en el corrector interactivo?

rboles Trie

16

Se pueden representar otros tipos de informacin,


cambiando el alfabeto A.
Ejemplo: representacin de URL de pginas web.

Representacin de tries

Cuestin: Cmo representar rboles trie?


tipo
ArbolTrie[A]= Puntero[NodoTrie[A]]

Reformulamos la pregunta: Cmo representar los


nodos del rbol trie?
NodoTrie
A

17

Representacin de tries

Un NodoTrie[A] es un Diccionario[tclave, tvalor], donde tclave= A


y tvalor= Puntero[NodoTrie[A]]

Operaciones:
Inserta (var n: NodoTrie[A]; caract: A; ptr: Puntero[NodoTrie[A]])
Consulta (n: NodoTrie[A]; caract: A): Puntero[NodoTrie[A]]
Anula (var n: NodoTrie[A])
TomaNuevo (var n: NodoTrie[A]; caract: A)

18

Representacin de tries

- Representacin mediante arrays.

- Representacin mediante listas.

19

Representacin de tries
-

Representacin mediante arrays.

tipo
NodoTrie[A]= array [A] de Puntero[NodoTrie[A]]
Ventaja: acceso muy rpido a los valores.
Inconveniente: desperdicia muy mucha memoria.

20

Representacin de tries
Inserta (var n: NodoTrie[A]; car: A; ptr: Puntero[NodoTrie[A]])
n[car]:= ptr
Consulta (n: NodoTrie[A]; car: A): Puntero[NodoTrie[A]]
devolver n[car]
Anula (var n: NodoTrie[A])
para i en Rango(A) hacer
n[i]:= NULO

21

TomaNuevo (var n: NodoTrie[A]; car: A)


n[car]:= NUEVO NodoTrie[A]
Anula (n[car])

Representacin de tries

Ejemplo, C= {ELLA, ELLO, EL, TU, Y, YO}

E
L

22

Representacin de tries

23

Ejemplo, C= {ELLA, ELLO, EL, TU, Y, YO}

Representacin de tries
-

Representacin mediante listas.

tipo NodoTrie[A]= registro


car: A
sig, ptr: Puntero[NodoTrie[A]]
finregistro

24

Ventaja: uso razonable de memoria.


Inconveniente: operaciones ms lentas.

Representacin de tries
Consulta (n: NodoTrie[A]; c: A): Puntero[NodoTrie[A]]
tmp:= PunteroA(n)
mientras tmp NULO AND tmpcar < c hacer
tmp:= tmpsig
si tmpcar c entonces devolver NULO
sino devolver tmpptr

25

Inserta (var n: NodoTrie[A]; car: A; ptr: Puntero[NodoTrie[A]])


1. Recorrer la lista buscando el carcter car
2. Si se encuentra, modificar el puntero ptr
3. En otro caso, aadir un nuevo nodo en la posicin
adecuada, con el carcter car y el puntero ptr

Representacin de tries

26

Ejemplo, C= {ELLA, ELLO, EL, TU, Y, YO}

Representacin de tries

27

Ejemplo, C= {ELLA, ELLO, EL, TU, Y, YO}

Representacin de tries
Utilizando la representacin de nodos trie (con listas o
con arrays) implementar las operaciones de insercin,
eliminacin y consulta sobre el trie.
pos
Ejemplo. Insertar ELLE.
E
Y
T

i
E

28

A
$

O
$

Representacin de tries
operacin Inserta (var a: ArbolTrie[A]; s: cadena)
var pos: Puntero[NodoTrie[A]]
i:= 1
pos:= a
mientras s[i] $ hacer
si Consulta (pos, s[i]) == NULO entonces
TomaNuevo (pos, s[i])
pos:= Consulta (pos, s[i])
i:= i + 1
finmientras
Inserta (pos, $, pos) // no confundir

29

Modificar el procedimiento para que haga una consulta.

Si queremos aadir informacin asociada a cada palabra, dnde


debera colocarse?

Representacin de tries
Cmo sera el uso del trie en el corrector interactivo?

30

Empezar una palabra


Colocar pos en la raz del rbol

Pulsar una tecla c en una palabra


Si Consulta (pos, c) == NULO entonces la palabra es incorrecta,
en otro caso moverse en el rbol

Acabar una palabra


Si Consulta (pos, $) == NULO entonces la palabra es incorrecta,
en otro caso es correcta

Borrar una letra de una palabra


Moverse hacia atrs en el rbol...

Evaluacin de los tries


Tiempo de ejecucin

31

El principal factor en el tiempo de ejecucin es la longitud


de las palabras: m.
Nodos con arrays: O(m)
Nodos con listas: O(m*s), donde s es la longitud promedio
de las listas. En la prctica, ~ O(m).
En el caso del corrector interactivo, la eficiencia es an ms
interesante, pues no tenemos que recorrer las palabras
enteras.

Evaluacin de los tries


Uso de memoria

Longitud promedio de las palabras: m. Longitud total: l


Nmero de palabras: n. Nmero de prefijos: p
k1 bytes/puntero, k2 bytes/carcter
d caracteres en el alfabeto (incluido $)
n << p << l

Nodos con arrays: d*k1 (p + 1) bytes

Nodos con listas: (2k1 + k2)(n + p) bytes

32

p+1 Nodos en el rbol


d*k1 bytes por nodo

n + p Nodos en el rbol
2k1 + k2 bytes por nodo

Evaluacin de los tries


Uso de memoria

Con listas simples: 2k1*l + k2*l bytes


La eficiencia de memoria depende de la relacin l/p

33

Si l/p es grande: las palabras comparten muchos prefijos.


Si l/p es pequea: hay pocos prefijos compartidos y se gasta mucha
memoria.

En la prctica, mejora l/p > 6

Conclusiones
La estructura es adecuada en aplicaciones donde aparezcan
muchos prefijos comunes.
El tiempo de ejecucin slo depende (casi) de la longitud de las
palabras, independientemente de cuntas hayan!

TAD rbol

Algunas de las operaciones usuales:

34

crearrbol(rbol T)
rbolVaco(rbol T)
vaciarrbol(rbol T)
verrbol(rbol T)
insertar(nodo n, nodo padre, rbol T)
borrar(nodo n, rbol T)
borrarSubrbol(nodo padre, rbol T)
nmeroNodos(rbol T)
profundidad(rbol T)
grado(rbol T)

Representando rboles genricos

No existe una representacin nica. La representacin escogida


viene condicionada fuertemente por el contexto de aplicacin y la
topologa del rbol (grado del rbol, nmero de nodos, el recorrido
sobre el rbol, etc.):

rboles n-arios

rboles binarios

35

Representacin directa (no demasiado viable, compleja de manejar)


Listas ordenadas de hijos
Punteros al padre
Hijo ms a la izquierda-Hermano de la derecha

Hijo izquierdo e hijo derecho para cada nodo: memoria dinmica o sobre
vectores.

Representando rboles genricos

Representacin directa: cada nodo es una estructura


que entre sus campos tendr una lista ordenada de
punteros a los nodos hijos y si se requiere un puntero
al nodo padre.

Resulta tediosa de manejar !!

rbol

36

Informacin estructura,
lista de punteros a hijos,
puntero al padre

Representando rboles genricos


Opcin 1

37

typedef struct // tipo base del rbol


{
tipo1 campo1;; tipoN campoN;
struct nodo *padre;
lista *hijos;
} nodo;
//
LISTA NODOS HIJOS
typedef struct // tipo base lista
{
nodo * hijo;
struct nodo_lista *sig;
}nodo_lista;
typedef struct
{
nodo_lista *inicio;
} lista;

Opcin 2
//
LISTA NODOS HIJOS
typedef struct // tipo base lista
{
nodo_arbol * hijo;
struct nodo_lista *sig;
}nodo_lista;
typedef struct
{
nodo_lista *inicio;
} lista;
typedef struct // tipo base del rbol
{
tipo1 campo1;; tipoN campoN;
struct nodo_arbol *padre;
lista *hijos;
} nodo_arbol;

Representando rboles genricos

Ambas propuestas anteriores incurren en una


paradoja

El problema viene inducido por culpa de la necesidad


de un campo sig en los nodos de una la lista.

38

El cdigo de la opcin 1 es paradjico porque no se puede


declarar una variable de un tipo de dato en este caso, el tipo
lista- cuando an no ha sido definido.
El cdigo de la opcin 2 es paradjico justamente por la
misma razn que en el caso 1, pero esta vez debido a la
declaracin nodo_arbol *hijo.

Cuestin: Cmo se podra solucionar?

Representando rboles genricos


typedef struct // tipo base del rbol
{
tipo1 campo1; tipoN campoN;
struct nodo *padre;
struct nodo ** hijos;
}nodo ;
typedef struct
{
nodo *raz;
} arbol;

39

void main() {
nodo n; // un nodo del rbol con 10 hijos
n->hijos=(nodo **) malloc(10*sizeof(nodo *));
}

Podemos simular una lista


mediante un vector dinmico !!
De esta manera ya no tenemos el
problema del puntero sig de una
lista sobre memoria dinmica.
hijos ser un vector de punteros a
nodos del rbol.
Podramos necesitar invocar a la
funcin realloc().

Representando rboles genricos

40

Al representar rboles genricos, por razones de


manejabilidad, se suelen hacer ciertas asunciones.
Algunas muy comunes son:
1.

Fijar un nmero mximo de hijos por nodo.

2.

Fijar un nmero mximo de nodos en el rbol:

Se utilizan estrategias de implementacin sobre memoria


esttica

Aparece el concepto ndice del nodo, que es la posicin que


ocupa un nodo del rbol en el vector.

Representando rboles genricos

Fijar un nmero mximo de hijos por nodo:


Opcin 1
typedef struct // tipo nodo del rbol
{
tipo1 campo1;

tipoN campoN;
struct nodo *padre;
struct nodo *hijos[n];
}nodo ;
typedef struct
{
nodo *raz;
} arbol;

41

Opcin 2
typedef struct // tipo nodo del rbol
{
tipo1 campo1;

tipoN campoN;
struct nodo *padre;
struct nodo * hijo1,,* hijoN;
}nodo ;
typedef struct
{
nodo *raz;
} arbol;

Representando rboles genricos

Fijar un nmero mximo de nodos


en el rbol (I).
0

(ndice del nodo)


2
1

3
4

5
5

6
7

42

En cada componente del vector se almacenara el


contenido del nodo del rbol correspondiente.

Lista ordenada de
nodos hijos. Cada
elemento de la lista
es el ndice de una
componente del
vector.

Representando rboles genricos


La anterior representacin permite visualizar todos los
nodos del rbol de una manera directa !!
Simplemente recorriendo las componentes de un vector.
En este caso en concreto, un nodo no posee puntero al
padre. Aunque se podra modificar la estructura para
guardar esta informacin !!
Ntese que al utilizar memoria esttica necesitamos
emplear alguna tcnica para controlar los huecos libres
en el vector !!

43

Representando rboles genricos

Ejercicio: Deseamos guardar la edad de los diferentes


empleados de una pyme, as como la posicin del empleado
dentro de la jerarqua de la empresa. Se supone que una pyme no
puede tener ms de 100 empleados. La jerarqua de la empresa
en cuestin, viene representada por el rbol de la figura adjunta.
(jefe)

0
1

2
9

10

3
8
5

44

(subordinado)

Representando rboles genricos

45

Escriba la secuencia de instrucciones en C para definir una


estructura de datos que permita modelar el concepto de
estructura jerrquica de una PYME cualquiera. Se requiere que a
partir de cada trabajador, tener acceso directo a su jefe y a sus
subordinados inmediatos.
Sabiendo que para la jerarqua de la ilustracin se cumple que: la
persona con ndice 0 posee 60 aos, las personas ubicadas en el
nivel 1 tienen 50 aos, las del nivel 2 tienen 40 aos a excepcin
de las personas ubicadas en el nodo hoja de este nivel que
poseen 35 aos. Las personas del tercer nivel tienen 30 aos y
las personas ubicadas en los nodos hojas restantes 25 aos.
Escriba la secuencia apropiada de instrucciones en C para crear
esta jerarqua.

Representando rboles genricos

Cuestin: Existe alguna relacin entre restringir el


nmero mximo de nodos en el rbol y restringir el
nmero mximo de nodos por niveles?

46

Si un rbol va a poseer un mximo de n nodos en total,


podemos asegurar que el nmero de nodos por nivel no va a
exceder de n-1. Con lo cual, podramos utilizar la
representacin de rboles con un nmero prefijado de hijos
por nodo, para representar rboles con un nmero total de
nodos
prefijado.
Aunque,
obviamente,
estaramos
desperdiciando una gran cantidad de memoria.

Representando rboles genricos

Fijar un nmero mximo de nodos en el rbol (II):


punteros al padre
rbol T

A
B

T= A, B, C, D, E, F, G, H,

47

C
E

Se asume que la componente


T[i].indice=i es la raz del rbol.

Representando rboles genricos

Existe alguna forma de representar


rboles de cualquier grado sin asumir
ninguna restriccin sobre el nmero de
nodos por hijo o el nmero de nodos
totales?

48

* No confundir con el
TAD rbol Binario

Representando rboles genricos

Utilizando rboles binarios * (hijo izquierdo - hermano


derecho):

49

Aunque resulte paradjico, un rbol n-ario puede ser


representado mediante un rbol binario.
Estrategia: cada nodo tendr dos punteros a nodo (o tres si se
decide mantener un puntero al padre). Uno para referenciar a
su hijo situado ms a la izquierda, y otro para referenciar a su
hermano de la derecha.
Se puede implementar tanto sobre memoria dinmica como
memoria esttica.

Representando rboles genricos:


hijo izquierdo - hermano derecho

Especificacin informal del TAD rbol

TAD rbol[T] es crea, vacio, raiz, padre, hijoIzquierdo,


hermanoDerecho, info, insertaHijo, insertaHermano, suprimeHijo,
suprimeHermano, modifica, nodoNulo.
Descripcin:
Los rbol[T] son rboles n-arios donde cada nodo contiene un dato
del tipo T. Las posiciones de los nodos en el rbol son del tipo Nodo.
Los rboles son modificables: las operaciones insertaHijo e
insertaHermano, suprimeHijo y suprimeHermano, modifica aaden,
eliminan y modifican respectivamente elementos de un rbol.

50

Representando rboles genricos:


hijo izquierdo - hermano derecho
Operaciones:
crea(sal A: Arbol)
Calcula: Devuelve un rbol vaco A.
vacio(ent A:Arbol; sal booleano)
Calcula: Devuelve cierto si A es el rbol vaco, y falso en caso contrario.
raiz(ent A:Arbol; sal Nodo)
Calcula: Devuelve el nodo raz en el rbol A. Si el rbol A est vaco,
devuelve nulo.
padre(ent A:Arbol; P:Nodo; sal Nodo)
Requiere: El rbol A es no vaco y P no es nodo nulo.
Calcula: Devuelve el nodo padre del nodo P en el rbol A. Si P es la raz
devuelve nulo.

51

Representando rboles genricos:


hijo izquierdo - hermano derecho
hijoIzquierdo(ent A:Arbol; P:Nodo; sal Nodo)
Requiere: El rbol A es no vaco y P no es nodo nulo.
Calcula: Devuelve el nodo hijo ms a la izqda. del nodo P en el rbol A.
Si el nodo P no tiene hijos, devuelve nulo.
hermanoDerecho(ent A:Arbol; P: Nodo; sal Nodo)
Requiere: El rbol A es no vaco. P no es nodo nulo.
Calcula: Devuelve el nodo hermano derecho del nodo P en el rbol A. Si
el nodo P no tiene hermano derecho, devuelve nulo.
info(ent A:Arbol; P: Nodo; sal elem: T)
Requiere: El rbol A es no vaco. P no es nodo nulo.
Calcula: Devuelve en elem el contenido del nodo P en el rbol A.

52

Representando rboles genricos:


hijo izquierdo - hermano derecho
insertaHijo(ent A:Arbol; P: Nodo; elem:T)
Requiere: Si el rbol A es no vaco, entonces P no es nodo nulo.
Modifica: A.
Calcula: Aade un nodo, con contenido elem, como hijo ms a la
izquierda del nodo P en el rbol A. Si el rbol A es vaco, entonces aade
un nodo con contenido elem como raz del rbol A.
insertaHermano(ent A:Arbol; P: Nodo; elem: T)
Requiere: El rbol A es no vaco. P no es nodo nulo. P no es la raiz.
Modifica: A.
Calcula: Aade un nodo, con contenido elem, como hermano derecho
del nodo P en el rbol A.
nodoNulo(ent P: Nodo; sal booleano)
Calcula: Devuelve cierto si P es nulo, y falso en caso contrario.

53

Representando rboles genricos:


hijo izquierdo - hermano derecho
suprimeHijo(ent A:Arbol; P: Nodo)
Requiere: El rbol A es no vaco. El nodo P no es nulo.
Modifica: A.
Calcula: Suprime el hijo ms a la izquierda del nodo P en el rbol A y
todos sus descendientes.
suprimeHermano(ent A:Arbol; P: Nodo)
Requiere: El rbol A es no vaco. El nodo P no es nulo.
Modifica: A.
Calcula: Suprime el hermano derecho del nodo P en el rbol A y todos
sus descendientes.
modifica(ent A:Arbol; P: Nodo; Elem: T)
Requiere: El rbol A es no vaco. El nodo P no es nodo nulo.
Modifica: A.
Calcula: Modifica el contenido del nodo P en el rbol A, cambindolo por
el nuevo contenido elem.

54

Representando rboles genricos:


hijo izquierdo - hermano derecho
Memoria dinmica
raz

A
B

55

C
E

D
H

typedef struct
{
tipo1 elem1; tipoN elemN;
struct nodo * hijo_izq, * herm_der;
} nodo;

E
F

Representando rboles genricos:


hijo izquierdo - hermano derecho
Memoria dinmica
(incluyendo puntero al padre)
raz

typedef struct
{
tipo1 elem1; tipoN elemN;
struct nodo * hijo_izq, * herm_der, * padre;
} nodo;

VER arbol.c
F

56

Representando rboles genricos:


hijo izquierdo - hermano derecho
Memoria esttica
hijo_izq
A

Raz
B
E

D
F

57

Evidentemente, el nmero de
nodos del rbol queda fijado al
nmero de componentes del vector !!

elem

herm_der

-1

-1

-1

-1

-1

-1

-1

-1

-1

Representando rboles genricos:


hijo izquierdo - hermano derecho

Sobre la representacin usando memoria esttica

* Como la especificacin

dice que devuelve nulo, la


implementacin con
memoria esttica y
Nodo de tipo entero
puede tomar como
valor nulo = -1. En C
se debera definir una cte:
#define NULO = -1

Mirar en arbol.c la
Implementacin con
memoria dinmica, para
ver cmo est definido el
tipo nodo.

58

Cuestin: Cmo identificamos un nodo hoja?

Por definicin, un nodo hoja es aquel que no tiene hijos, y por lo


tanto, es condicin necesria y suficiente que el valor del campo
hijo_izq sea 1 *.

Cuestin: Cmo identificamos el nodo raz?

Resulta imposible porque la representacin no informa en


absoluto de los nodos ascendientes de un nodo dado, por lo
tanto necesitamos una variable auxiliar que indique qu
componente del vector se corresponde con el nodo raz del rbol.

Representando rboles genricos:


hijo izquierdo - hermano derecho

Sobre la representacin usando memoria esttica

Ejercicio: Dado un nodo cualquiera, Cmo podemos


averiguar la posicin en el vector del nodo padre?

Ejercicio: Implementa en C la estructura de datos para


representar un rbol cualquiera. Supngase que elem es de
un tipo ya predefinido.
Cuestin: Cmo podemos modificar la estructura para que
cada nodo guarde la posicin de su nodo padre?

59

Sugerencia: a excepcin del nodo raz, todos los los nodos


restantes poseen un nodo padre. Implementa una solucin
algortmica en pseudo-cdigo.

Aadir una columna ms en el vector de la estructura que


almacene la posicin del padre de un nodo. El nodo raz tendr a
-1 esta columna.

Recorrido sobre rboles genricos

Hay varias posibilidades para recorrer los nodos de un


rbol genrico:

Primero en profundidad:

Primero en anchura o amplitud:

60

Exploramos el rbol hasta llegar a un nodo hoja al mismo tiempo


que nos anotamos por cada nodo, que visitamos hasta llegar a
este nodo hoja, los nodos hijos pendientes por explorar.
3 posibilidades: preorden (nodo actual, subrbol izquierdo, resto
de subrboles derechos), inorden (subrbol izquierdo, nodo
actual, resto de subrboles derechos), postorden (subrbol
izquierdo, resto de subrboles derechos, nodo actual).
Recorremos el rbol por niveles.

Estrategias combinadas:

Combinan las dos anteriores.

rboles binarios

rboles binarios

61

Un rbol binario es un rbol con raz en el que cada nodo


tiene como mximo dos hijos.
rbol de grado 2. A cada uno de los subrboles se les llama
subrbol izquierdo y subrbol derecho.
Un rbol binario completo es un rbol en el que cada nodo
tiene cero o dos hijos.
Un rbol binario perfecto es un rbol binario completo en el
que todas las hojas tienen la misma profundidad (distancia
desde la raz, tambin llamada altura).

rboles binarios

rboles binarios

Cada nodo puede tener hasta dos ramas.


Se admite el concepto de rbol binario vaco: cuando el nmero de
nodos es cero
Definicin: conjunto finito de nodos que; o bien est vaco o consiste
en una raz y dos rboles binarios disjuntos llamados subrbol
izquierdo y subrbol derecho (diferencia de rboles genricos).

62

Representando rboles genricos:


hijo izquierdo - hermano derecho

Especificacin informal del TAD rbol Binario

TAD rbolBinario[T] es crea, vacio, raiz, padre, hijoIzquierdo,


hijoDerecho, info, insertaIzqdo, insertaDerecho, suprimeIzqdo,
suprimeDerecho, modifica, nodoNulo.
Descripcin:
Los rbolBinario[T] son rboles binarios donde cada nodo contiene
un dato del tipo T. Los nodos en el rbol son del tipo Nodo. Los
rboles son modificables: las operaciones insertaIzqdo e
insertaDerecho, suprimeIzqdo y suprimeDerecho, modifica aaden,
eliminan y modifican respectivamente elementos de un rbol.

63

Representando rboles genricos:


hijo izquierdo - hermano derecho
Operaciones:
crea(sal A: ArbolBinario)
Calcula: Devuelve un rbol vaco A.
vacio(ent A:ArbolBinario; sal booleano)
Calcula: Devuelve cierto si A es el rbol vaco, y falso en caso contrario.
raiz(ent A:ArbolBinario; sal Nodo)
Calcula: Devuelve el nodo raz en el rbol A. Si el rbol A est vaco,
devuelve nulo.
padre(ent A:ArbolBinario; P:Nodo; sal Nodo)
Requiere: El rbol A es no vaco y P no es nodo nulo.
Calcula: Devuelve el nodo padre del nodo P en el rbol A. Si P es la raz
devuelve nulo.

64

Representando rboles genricos:


hijo izquierdo - hermano derecho
hijoIzquierdo(ent A:ArbolBinario; P:Nodo; sal Nodo)
Requiere: El rbol A es no vaco y P no es nodo nulo.
Calcula: Devuelve el nodo hijo izquierdo del nodo P en el rbol A. Si el
nodo P no tiene hijo izquierdo, devuelve nulo.
hijoDerecho(ent A:ArbolBinario; P:Nodo; sal Nodo)
Requiere: El rbol A es no vaco. P no es nodo nulo.
Calcula: Devuelve el nodo hijo derecho del nodo P en el rbol A. Si el
nodo P no tiene hijo derecho, devuelve nulo.
info(ent A:ArbolBinario; P:Nodo; sal elem: T)
Requiere: El rbol A es no vaco. P no es nodo nulo.
Calcula: Devuelve en elem el contenido del nodo P en el rbol A.

65

Representando rboles genricos:


hijo izquierdo - hermano derecho
insertaIzqdo(ent A:ArbolBinario; P:Nodo; elem:T)
Requiere: Si el rbol A es no vaco, entonces el nodo P es no nulo y el
nodo hijo izquierdo de P es nulo
Modifica: A.
Calcula: Aade un nodo, con contenido elem, como hijo izquierdo del
nodo P en el rbol A. Si el rbol A es vaco, entonces aade un nodo con
contenido elem como raz del rbol A.
insertaDerecho(ent A:ArbolBinario; P:Nodo; elem: T)
Requiere: El rbol A es no vaco. El nodo P es no nulo. El nodo hijo
derecho de P es nulo.
Modifica: A.
Calcula: Aade un nodo, con contenido elem, como hijo derecho del
nodo P en el rbol A.
nodoNulo(ent P:Nodo; sal booleano)
Calcula: Devuelve cierto si P es nulo, y falso en caso contrario.

66

Representando rboles genricos:


hijo izquierdo - hermano derecho
suprimeIzqdo(ent A:ArbolBinario; P:Nodo)
Requiere: El rbol A es no vaco. El nodo P no es nulo.
Modifica: A.
Calcula: Suprime el hijo izquierdo del nodo P en el rbol A y todos sus
descendientes.
suprimeDerecho(ent A:ArbolBinario; P:Nodo)
Requiere: El rbol A es no vaco. El nodo P no es nulo.
Modifica: A.
Calcula: Suprime el hijo derecho del nodo P en el rbol A y todos
sus descendientes.
modifica(ent A:ArbolBinario; P:Nodo; Elem: T)
Requiere: El rbol A es no vaco. El nodo P no es nodo nulo.
Modifica: A.
Calcula: Modifica el contenido del nodo P en el rbol A, cambindolo por
el nuevo contenido elem.

67

Recorrido sobre rboles binarios

68

Ejercicio: desarrollar en pseudo-cdigo un


mtodo para explorar en profundidad un
rbol binario.

Recorrido sobre rboles binarios

Ejemplo: cdigo para explorar el rbol en


inorden.
funcion inorden(nodo)
inicio
si(existe(nodo))
inicio
inorden(hijoIzqdo(nodo));
visitar(nodo);
inorden(hijoDerecho(nodo));
fin;
fin;

void inorden(Arbol *A, nodo *p) {


if (p != NULL) {
inorden(A, hijoIzqdo(A, p));
tratar(A, p);
inorden(A, hijoDerecho(A, p));
}
}

VER arbolbinario.c
69

Vous aimerez peut-être aussi