Está en la página 1de 27

GRAFOS DE PRECEDENCIA Grafo acclico orientado cuyos nodos corresponden a sentencias individuales.

Un arco de un nodo Si al nodo Sj significa que la sentencia Sj puede ejecutarse slo cuando ha acabado Si. Ejemplo:
S 1 S 2 S 4 S 5 S 6 S 7 S 3

ESPECIFICACIN DE LA CONCURRENCIA os grafos no se pueden usar en programacin. !ecesitamos otras herramientas: FORK / JOIN FORK L Genera dos ejecuciones concurrentes en un programa: ". Una se inicia en la instruccin siguiente a #$%& '. $tra empie(a en la instruccin etiquetada JOIN )ermite recombinar varias ejecuciones paralelas en una sola. a rama que ejecuta primero la instruccin *$+! termina su ejecucin.

)ara saber el n,mero de ramas que se deben reunir se usa un par-metro con *$+! .una variable entera no negativa que se iniciali(a con el n,mero de ejecuciones paralelas a reunir/. a ejecucin de una instruccin *$+! 0$!1 tiene el siguiente efecto: 0$!1 :2 0$!1 3"4 +# 0$!1 5 16E! 71E%8+!9% %989:4 a instruccin *$+! tiene que ejecutarse indivisi !"#"n$" es decir; la ejecucin concurrente de dos instrucciones *$+! es equivalente a la ejecucin secuencial en un orden indeterminado. E*E8) $: +mplementar; usando #$%&<*$+!; el grafo de precedencia de la figura. S"4 0$!1 :2 =4 #$%& "4 S'4 S>4 #$%& '4 S?4 G$1$ =4 ': S@4 G$1$ =4 ": S=4 =: *$+! 0$!14 SA4

S 1 S 2 S 4 S 5 S 6 S 7 S 3

CO%EGIN / COEND Es de mayor nivel que la pareja #$%&<*$+! y tiene la forma siguiente: 0$BEG+! S"4 S S'4 & ... ( Sn4 S S S 1 2 3 0$E!C4
Sn'1

1odas las instrucciones insertadas entre las palabras clave 0$BEG+! y 0$E!C se ejecutar-n concurrentemente. E*E8) $: +mplementar; usando 0$BEG+!<0$E!C; el grafo de precedencia de la figura adjunta. S"4 0$BEG+! S=4 BEG+! S'4 S>4 0$BEG+! S?4 S@4 0$E!C E!C 0$E!C4 SA4
S 1 S 2 S 4 S 5 S 6 S 7 S 3

+mplementacin de 0$BEG+!<0$E!C con #$%&<*$+! 0$BEG+! S"4 S'4 .... Sn4 0$E!C4 0$!1 :2 n4 #$%& '4 #$%& =4 ... #$%& n4 S"4 G$1$ "4 ': S'4 G$1$ "4 =: S=4 G$1$ "4 ... n: Sn4 ": *$+! 0$!14 E*E%0+0+$: Cada la eDpresin .9 E B/ F .0 E C/ 3 .E<#/ Establecer el grafo correspondiente que eDtraiga el m-Dimo grado de paralelismo e implementar dicho grafo utili(ando: 9/ a pareja 0$BEG+!<0$E!C B/ a construccin #$%&<*$+!

RE)UISI*OS DE LAS SOLUCIONES Una solucin al problema de la seccin crtica debe cumplir los tres requisitos siguientes: ". E+,!-si.n #-$-/0 Si un proceso )i se est- ejecutando en su seccin crtica; entonces ning,n otro proceso se puede estar ejecutando en la suya. '. P1231"si.n0 !ing,n proceso suspendido fuera de su seccin crtica debe impedir progresar a otros procesos. =. Es4"1/ !i#i$/d/0 Si un proceso ha solicitado entrar en su S0; debe haber un lmite al n,mero de veces que otros procesos entren en sus respectivas S0; antes de que el primero lo consiga. Se supone que cada proceso se ejecuta a una velocidad no nula; aunque no se puede asegurar nada sobre las velocidades relativas de los procesos. 9l presentar los algoritmos se definen slo las variables utili(adas para sincroni(acin. 0ada proceso tendr- la siguiente estructura: )i: 1"4"/$ ... 0GC+G$ CE E!1%9C9 SE00+G! 0%H1+09 0GC+G$ CE S9 +C9 SE00+G! %ES+CU9 -n$i! false4 o que cambiar- de una solucin a otra es la forma de llevar a cabo los recuadros marcados. SOLUCIONES PARA DOS PROCESOS

A!321i$#2 1 v/1 turno: 5.."4 )i: 1"4"/$ 56i!" turno i d2 no3op4 SE00+G! 0%H1+09 turno :2 j4 SE00+G! %ES+CU9 -n$i! false4 Se garanti(a la eDclusin mutua !o se garanti(a la progresin 6ay espera improductiva A!321i$#2 2 v/1 indicador: /11/7 I5.."] 28 boolean4 )i: 1"4"/$ indicadorIi] :2 true4 56i!" indicadorIj] d2 no3op4 SE00+G! 0%H1+09 indicadorIi] :2 false4 SE00+G! %ES+CU9 -n$i! false4 Se garanti(a la eDclusin mutua !o se garanti(a la progresin 6ay espera improductiva A!321i$#2 2 .variante/ v/1 indicador: /11/7 I5.."] 28 boolean4 )i: 1"4"/$ 56i!" indicadorIj] d2 no3op4 indicadorIi] :2 true4 SE00+G! 0%H1+09 indicadorIi] :2 false4

SE00+G! %ES+CU9 -n$i! false4 !o se garanti(a la eDclusin mutua Se garanti(a la progresin 6ay espera improductiva A!321i$#2 3 .)eterson/ v/1 indicador: /11/7 I5.."] 28 boolean4 turno: 5.."4 )i: 1"4"/$ indicadorIi] :2 true4 turno :2 j4 56i!" .indicadorIj] and $-1n22j/ d2 no3op4 SE00+G! 0%H1+09 indicadorIi] 2 false4 SE00+G! %ES+CU9 -n$i! false4 Se garanti(a eDclusin mutua .ver/ Se garanti(a la progresin Se garanti(a la espera limitada 6ay espera improductiva SOPOR*E 9ARD:ARE PARA SINCRONI;ACIN a solucin m-s simple es +!69B+ +19%<69B+ +19% interrupciones. +nconvenientes: )eligroso en manos del usuario. !o sirve si se tienen dos o m-s 0)Us. EDisten otras soluciones .softJare/ que requieren algo de ayuda del hardJare. +nstrucciones especiales: 1est3and3Set SJap

*"s$</nd<S"$ .Evaluar3y3asignar/ )uede definirse .de forma algortmica/ como una funcin: 8-n,$i2n 19S .v/1 objetivo: boolean/: boolean4 "3in 19S :2 objetivo4 objetivo :2 true4 "nd4 a caracterstica esencial es que la instruccin se ejecuta ; es decir; como una unidad ininterrumpible .en un slo ciclo de memoria/. Si se ejecutan dos 19S simult-neamente lo har-n siguiendo alg,n orden arbitrario. S2!-,i.n ,2n *"s$</nd<S"$ v/1 cerradura: boolean .:2 false/4 )i: 1"4"/$ 56i!" 19S.cerradura/ d2 no3op4 SE00+G! 0%H1+09 cerradura :2 false4 SE00+G! %ES+CU9 -n$i! false4 Se garanti(a la eDclusin mutua Se garanti(a la progresin !o se garanti(a la espera limitada 6ay espera improductiva S2!-,i.n ,2n S5/4 v/1 cerradura: boolean .:2 false/4 )i: v/1 clave: boolean4 1"4"/$ llave :2 true4 1"4"/$ SK9).cerradura; llave/4

-n$i! llave 2 false4 SE00+G! 0%H1+09 cerradura :2 false4 SE00+G! %ES+CU9 -n$i! false4 Se garanti(a la eDclusin mutua Se garanti(a la progresin !o se garanti(a la espera limitada 6ay espera improductiva A!321i$#2 d" %-1ns =4/1/ n 412,"s2s> v/1 esperando: /11/7I5..n3"] 28 boolean .:2 false/4 cerradura: boolean .:2 false/4 )i: v/1 j: 5..n3"4 llave: boolean4 1"4"/$ esperandoIi] :2 true4 llave :2 true4 56i!" =esperandoIi] /nd llave/ d2 llave :2 19S.cerradura/4 esperandoIi] :2 false4 SE00+G! 0%H1+09 j :2 i E" #2d n4 56i!" .j i/ /nd .n2$ esperandoIj] / d2 j :2 jE" #2d n4 i8 j2i $6"n cerradura :2 false "!s" esperandoIj] :2 false4 SE00+G! %ES+CU9 -n$i! false4 SE?@FOROS Un sem-foro es una variable entera protegida que; aparte de la ini,i/!iA/,i.n; slo puede ser accedida por medio de

dos operaciones indivisi !"s est-ndar: ).s/ K9+1.s/ ES)E%9.s/ L.s/ S+G!9 .s/ SEM9 .s/ as definiciones cl-sicas de estas operaciones son: K9+1.s/: Jhile s 5 do no3operacin4 s :2 s 3 "4 S+G!9 .s/: s :2 s E "4 US$ CE SE8N#$%$S )9%9 EO0 US+G! 8U1U9 v/1 muteD: sem-foro4 )i: 1"4"/$ Jait.muteD/4 SE00+G! 0%H1+09 signal.muteD/4 SE00+G! %ES+CU9 -n$i! false4 Esta solucin es aplicable a n procesos. Se asocia un sem-foro a cada recurso de acceso eDclusivo. El valor inicial del sem-foro se establece a " de modo que slo un proceso pueda ejecutar la operacin Jait con PDito. a iniciali(acin es responsabilidad del proceso padre. REBISIN DE LA DEFINICIN DE SE?@FORO )roblema de la espera activa: 0uando un proceso ejecuta la operacin Jait sobre un sem-foro con valor no positivo; tiene que hacer una espera que es improductiva. )ara evitarlo; el proceso debera !2C-"/1s" a s mismo. El bloqueo sit,a al proceso en estado de espera y transfiere el control al Sistema $perativo; que puede

seleccionar a otro proceso de la cola de preparados. Un proceso bloqueado en un sem-foro es reactivado por otro proceso que ejecute la operacin signal sobre el mismo sem-foro. El proceso QdespiertaR por una operacin que cambie el estado del proceso bloqueado y lo ponga en la cola de preparado para ejecucin. )or ello se redefine el concepto de sem-foro como un entero m-s una lista de procesos. $74" semforo 2 1",21d valor: integer4 : lista de proceso4 "nd4 as operaciones Jait y signal se redefinen como: Jait.S/: S.valor :2 S.valor 3 "4 if S.valor 7 5 then begin 7aSadir proceso a S. :4 bloquear4 end4 signal.S/: S.valor :2 S.valor E "4 if S.valor " then begin 7sacar proceso ) de S. :4 despertar.)/4 end4 0on esta definicin; el valor del sem-foro puede ser negativo. En tal caso; su magnitud equivale al n,mero de procesos que est-n esperando en el sem-foro. El aspecto clave es que las operaciones sobre un sem-foro se ejecuten de forma indivisi !".

Esta es una nueva situacin de seccin crtica que puede resolverse usando cualquiera de las soluciones vistas. !o se ha eliminado completamente el problema de la espera activa. o que se consigue es: Eliminarla del programa de aplicacin. imitarla a las S.0. de Jait y signal; que son bastante cortas. 9s; la espera improductiva no se produce casi nunca y; cuando se produce; ocurre durante un periodo muy breve. USO DE SE?@FOROS PARA SINCRONI;ACIN Sean )" y )' dos procesos que se est-n ejecutando concurrentemente y supongamos que )" incluye una instruccin .S"/ que slo puede ser ejecutada despuPs de que se haya ejecutado una instruccin .S'/ de )'. Se usa un sem-foro compartido iniciali(ado a cero .5/. v/1 S: sem-foro .S.valor :2 5/4 )": 1"4"/$ )': 1"4"/$ ... ... Jait.S/4 S'4 S"4 signal.S/4 ... ... -n$i! false4 -n$i! false4 Si )" ejecuta Jait antes que )' haga signal )" espera a )' Si )' ejecuta signal antes de que )" haga Jait )" hace Jait sin bloquearse Usando sem-foros para sincroni(acin en combinacin de 0$BEG+!<0$E!C; puede resolverse cualquier grafo de precedencia. E*E8) $: El grafo de precedencia

adjunto no tiene un programa correspondiente usando slo la instruccin concurrente.


S 1 S 2 S 4 S 5 S 6 S 7 S 3

v/1 9; B; 0; C; E; #; G: semforo .:2 5; 5; 5; 5; 5; 5; 5/4 ,2 "3in "3in S"4 signal.9/4 signal.B/4 "nd4 "3in Jait.9/4 S'4 S>4 signal.0/4 signal.C/4 "nd4 "3in Jait.B/4 S=4 signal.E/4 "nd4 "3in Jait.0/4 S?4 signal.#/4 "nd4 "3in Jait.C/4 Jait .E/4 S@4 signal.G/4 "nd4 "3in Jait.#/4 Jait .G/4 SA4 "nd4 ,2"nd

Definicin de rbol
Un rbol es una estructura de datos, que puede definirse de forma recursiva como: - Una estructura vaca o - Un elemento o clave de informacin (nodo) ms un nmero finito de estructuras tipo rbol, disjuntos, llamados subrboles. i dic!o nmero de estructuras es inferior o i"ual a #, se tiene un rbol binario. $s, por tanto, una estructura no secuencial. %tra definicin nos da el rbol como un tipo de "rafo (ver "rafos): un rbol es un "rafo acclico, cone&o ' no diri"ido. $s decir, es un "rafo no diri"ido en el que e&iste e&actamente un camino entre todo par de nodos. $sta definicin permite implementar un rbol ' sus operaciones empleando las representaciones que se utili(an para los "rafos. in embar"o, en esta seccin no se tratar esta implementacin.

Formas de representacin
- )ediante un "rafo:

Figura 1

- )ediante un dia"rama encolumnado: a b c d e f

$n la computacin se utili(a muc!o una estructura de datos, que son los rboles binarios. $stos rboles tienen *, + o # descendientes como m&imo. $l rbol de la fi"ura anterior es un ejemplo vlido de rbol binario.

Nomenclatura sobre rboles


- ,a(: es aquel elemento que no tiene antecesor- ejemplo: a. - ,ama: arista entre dos nodos. - .ntecesor: un nodo / es es antecesor de un nodo 0 si por al"una de las ramas de / se puede lle"ar a 0. - ucesor: un nodo / es sucesor de un nodo 0 si por al"una de las ramas de 0 se puede lle"ar a /. - 1rado de un nodo: el nmero de descendientes directos que tiene. $jemplo: c tiene "rado #, d tiene "rado *, a tiene "rado #. - 2oja: nodo que no tiene descendientes: "rado *. $jemplo: d - 3odo interno: aquel que tiene al menos un descendiente. - 3ivel: nmero de ramas que !a' que recorrer para lle"ar de la ra( a un nodo. $jemplo: el nivel del nodo a es + (es un convenio), el nivel del nodo e es 4. - .ltura: el nivel ms alto del rbol. $n el ejemplo de la fi"ura + la altura es 4. - .nc!ura: es el ma'or valor del nmero de nodos que !a' en un nivel. $n la fi"ura, la anc!ura es 4. Aclaraciones: se !a denominado a a la ra(, pero se puede observar se"n la fi"ura que cualquier nodo podra ser considerado ra(, basta con girar el rbol. 5odra determinarse por ejemplo que b fuera la ra(, ' a ' d los sucesores inmediatos de la ra( b. in embar"o, en las implementaciones sobre un computador que se reali(an a continuacin es necesaria una jerarqua, es decir, que !a'a una nica ra(.

Declaracin de rbol binario


e definir el rbol con una clave de tipo entero (puede ser cualquier otra tipo de datos), ' dos !ijos: i(quierdo (i(q) ' derec!o (der). 5ara representar los enlaces con los !ijos se utili(an punteros. $l rbol vaco se representar con un puntero nulo. $n 6 un rbol binario puede declararse de la si"uiente manera: typedef struct tarbol { int clave; struct tarbol *izq, *der; } tarbol; $n 5ascal el equivalente es 7ste: Type tArbol = ^tNodo; tNodo = R !"R# !lave $ %nte&er;

%zq, #er $ tArbol; end; %tras declaraciones tambi7n a8aden un enlace al nodo padre, pero no se estudiarn aqu.

Recorridos sobre rboles binarios


e consideran dos tipos de recorrido: recorrido en profundidad ' recorrido en anc!ura o a nivel. 5uesto que los rboles no son secuenciales como las listas, !a' que buscar estrate"ias alternativas para visitar todos los nodos. - Recorridos en profundidad: 9 ,ecorrido en preorden: consiste en visitar el nodo actual (visitar puede ser simplemente mostrar la clave del nodo por pantalla), ' despu7s visitar el subrbol i(quierdo ' una ve( visitado, visitar el subrbol derec!o. $s un proceso recursivo por naturale(a. i se !ace el recorrido en preorden del rbol de la fi"ura + las visitas seran en el orden si"uiente: a,b,d,c,e,f. 6odificacin en C: void preorden'tarbol *a( { if 'a )= N*++( { visitar'a(; preorden'a,-izq(; preorden'a,-der(; } } $n Pascal: .rocedure preorden'a $ tarbol(; be&in if 'a /- N%+( t0en be&in visitar'a(; preorden'a^1%zq(; preorden'a^1#er( end end;

9 ,ecorrido en inorden u orden central: se visita el subrbol i(quierdo, el nodo actual, ' despu7s se visita el subrbol derec!o. $n el ejemplo de la fi"ura + las visitas seran en este orden: b,d,a,e,c,f. 6odificacin en C: void inorden'tarbol *a( { if 'a )= N*++( { inorden'a,-izq(;

} }

visitar'a(; inorden'a,-der(;

$n Pascal: .rocedure inorden'a $ tarbol(; be&in if 'a /- N%+( t0en be&in inorden'a^1%zq(; visitar'a(; inorden'a^1#er( end end; 9 ,ecorrido en postorden: se visitan primero el subrbol i(quierdo, despu7s el subrbol derec!o, ' por ltimo el nodo actual. $n el ejemplo de la fi"ura + el recorrido quedara as: d,b,e,f,c,a. 6odificacin en C: void postorden'arbol *a( { if 'a )= N*++( { postorden'a,-izq(; postorden'a,-der(; visitar'a(; } } $n Pascal: .rocedure postorden'a $ tarbol(; be&in if 'a /- N%+( t0en be&in postorden'a^1%zq(; postorden'a^1#er( visitar'a(; end end; :a ventaja del recorrido en postorden es que permite borrar el rbol de forma consistente. $s decir, si visitar se traduce por borrar el nodo actual, al ejecutar este recorrido se borrar el rbol o subrbol que se pasa como parmetro. :a ra(n para !acer esto es que no se debe borrar un nodo ' despu7s sus subrboles, porque al borrarlo se pueden perder los enlaces, ' aunque no se perdieran se rompe con la re"la de manipular una estructura de datos ine&istente. Una alternativa es utili(ar una variable au&iliar, pero es innecesario aplicando este recorrido.

- Recorrido en amplitud: 6onsiste en ir visitando el rbol por niveles. 5rimero se visitan los nodos de nivel + (como muc!o !a' uno, la ra(), despu7s los nodos de nivel #, as !asta que 'a no queden ms.

i se !ace el recorrido en amplitud del rbol de la fi"ura una visitara los nodos en este orden: a,b,c,d,e,f $n este caso el recorrido no se reali(ar de forma recursiva sino iterativa, utili(ando una cola (ver 6olas) como estructura de datos au&iliar. $l procedimiento consiste en encolar (si no estn vacos) los subrboles i(quierdo ' derec!o del nodo e&traido de la cola, ' se"uir desencolando ' encolando !asta que la cola est7 vaca. $n la codificacin que viene a continuacin no se implementan las operaciones sobre colas. 6odificacin en C: void a2plitud'tarbol *a( { t!ola cola; 3* las claves de la cola ser4n de tipo 4rbol binario *3 arbol *au5; if 'a )= N*++( { !rear!ola'cola(; encolar'cola, a(; 60ile ')colavacia'cola(( { desencolar'cola, au5(; visitar'au5(; if 'au5,-izq )= N*++( encolar'cola, au5,-izq(; if 'au5,-der )= N*++( encolar'cola, au5,-der(; } }

6odificacin en Pascal: procedure a2plitud'a $ tArbol(; var cola $ t!ola; 3* las claves de la cola ser4n de tipo 4rbol binario *3 au5 $ tArbol; be&in if a /- N%+ t0en be&in !rear!ola'cola(; encolar'cola, a(; 70ile Not colavacia'cola( #o be&in desencolar'cola, au5(; visitar'au5(; if au5^1izq /- N%+ encolar'cola, au5^1izq(; if au5^1der /- N%+ encolar'cola, au5^1der( end end end;

5or ltimo, consid7rese la sustitucin de la cola por una pila en el recorrido en amplitud. ;<u7 tipo de recorrido se obtiene=

Construccin de un rbol binario

2asta el momento se !a visto la declaracin ' recorrido de un rbol binario. in embar"o no se !a estudiado nin"n m7todo para crearlos. . continuacin se estudia un m7todo para crear un rbol binario que no ten"a claves repetidas partiendo de su recorrido en preorden e inorden, almacenados en sendos arra's. .ntes de e&plicarlo se recomienda al lector que lo intente !acer por su cuenta, es sencillo cuando uno es capa( de construir el rbol viendo sus recorridos pero sin !aber visto el rbol terminado. 5artiendo de los recorridos preorden e inorden del rbol de la fi"ura + puede determinarse que la ra( es el primer elemento del recorrido en preorden. $se elemento se busca en el arra' inorden. :os elementos en el arra' inorden entre izq ' la ra( forman el subrbol i(quierdo. .simismo los elementos entre der ' la ra( forman el subrbol derec!o. 5or tanto se tiene este rbol:

. continuacin comien(a un proceso recursivo. e procede a crear el subrbol i(quierdo, cu'o tama8o est limitado por los ndices izq ' der. :a si"uiente posicin en el recorrido en preorden es la ra( de este subrbol. <ueda esto:

$l subrbol b tiene un subrbol derec!o, que no tiene nin"n descendiente, tal ' como indican los ndices izq ' der. e !a obtenido el subrbol i(quierdo completo de la ra( a, puesto que b no tiene subrbol i(quierdo:

>espu7s se"uir constru'7ndose el subrbol derec!o a partir de la ra( a. e pueden ver las implementaciones en 6 ' 5ascal en los fic!eros arbol.c ' arbol.pas, que muestran tanto la lectura en disco de los arra's como la salida por pantalla.

Ejercicio: !acer un pro"rama que constru'a un rbol partiendo de sus recorridos en inorden ' en postorden.

rbol binario de bsqueda


Un rbol binario de bsqueda es aquel que es: - Una estructura vaca o - Un elemento o clave de informacin (nodo) ms un nmero finito -a lo sumo dosde estructuras tipo rbol, disjuntos, llamados subrboles ' adems cumplen lo si"uiente: 9 ?odas las claves del subrbol i(quierdo al nodo son menores que la clave del nodo. 9 ?odas las claves del subrbol derec!o al nodo son ma'ores que la clave del nodo. 9 .mbos subrboles son rboles binarios de bsqueda.

Un ejemplo de rbol binario de bsqueda:

Figura 5 .l definir el tipo de datos que representa la clave de un nodo dentro de un rbol binario de bsqueda es necesario que en dic!o tipo se pueda establecer una relacin de orden. 5or ejemplo, suponer que el tipo de datos de la clave es un puntero (da i"ual a lo que apunte). i se codifica el rbol en 5ascal no se puede establecer una relacin de orden para las claves, puesto que 5ascal no admite determinar si un puntero es ma'or o menor que otro. $n el ejemplo de la fi"ura @ las claves son nmeros enteros. >ada la ra( 4, las claves del subrbol i(quierdo son menores que A, ' las claves del subrbol derec!o son ma'ores que A. $sto se cumple tambi7n para todos los subrboles. i se !ace el recorrido de este rbol en orden central se obtiene una lista de los nmeros ordenada de menor a ma'or. 6uestin: ;<u7 !a' que !acer para obtener una lista de los nmeros ordenada de ma'or a menor= Una ventaja fundamental de los rboles de bsqueda es que son en "eneral muc!o ms rpidos para locali(ar un elemento que una lista enla(ada. 5or tanto, son ms rpidos para insertar ' borrar elementos. i el rbol est perfectamente equilibrado -esto es, la diferencia entre el nmero de nodos del subrbol i(quierdo ' el nmero de nodos del subrbol derec!o es a lo sumo +, para todos los nodosentonces el nmero de comparaciones necesarias para locali(ar una clave es apro&imadamente de lo"3 en el peor caso. .dems, el al"oritmo de insercin en un rbol binario de bsqueda tiene la ventaja -sobre los arra's ordenados, donde se empleara bsqueda dicotmica para locali(ar un elemento- de que no necesita !acer una reubicacin de los elementos de la estructura para que esta si"a ordenada despu7s de la insercin. >ic!o al"oritmo funciona avan(ando por el rbol esco"iendo la rama i(quierda o derec!a en funcin de la clave que se inserta ' la clave del nodo actual, !asta encontrar su ubicacin- por ejemplo, insertar la clave B en el rbol de la fi"ura @ requiere avan(ar por el rbol !asta lle"ar a la clave C, e introducir la nueva clave en el subrbol i(quierdo a 8. $l al"oritmo de borrado en rboles es al"o ms complejo, pero ms eficiente que el de borrado en un arra' ordenado. .!ora bien, suponer que se tiene un rbol vaco, que admite claves de tipo entero. uponer que se van a ir introduciendo las claves de forma ascendente. $jemplo: +,#,4,A,@,D e crea un rbol cu'a ra( tiene la clave +. e inserta la clave # en el subrbol derec!o de 1. . continuacin se inserta la clave 4 en el subrbol derec!o de . 6ontinuando las inserciones se ve que el rbol de"enera en una lista secuencial, reduciendo drsticamente su eficacia para locali(ar un elemento. >e todas formas es poco probable que se de un caso de este tipo en la prctica. i las claves a

introducir lle"an de forma ms o menos aleatoria entonces la implementacin de operaciones sobre un rbol binario de bsqueda que vienen a continuacin son en "eneral suficientes. $&isten variaciones sobre estos rboles, como los .E: o ,ed-FlacG (no se tratan aqu), que sin lle"ar a cumplir al +**H el criterio de rbol perfectamente equilibrado, evitan problemas como el de obtener una lista de"enerada.

Operaciones bsicas sobre rboles binarios de b squeda - ! squeda i el rbol no es de bsqueda, es necesario emplear uno de los recorridos anteriores sobre el rbol para locali(arlo. $l resultado es id7ntico al de una bsqueda secuencial. .provec!ando las propiedades del rbol de bsqueda se puede acelerar la locali(acin. implemente !a' que descender a lo lar"o del rbol a i(quierda o derec!a dependiendo del elemento que se busca. 6odificacin en C: boolean buscar'tarbol *a, int ele2( { if 'a == N*++( return 8A+9 ; else if 'a,-clave / ele2( return buscar'a,-der, ele2(; else if 'a,-clave - ele2( return buscar'a,-izq, ele2(; else return TR* ; } 6odificacin en Pascal: 8unction buscar'a $ tarbol; ele2 $ %nte&er( $ boolean; be&in if a = N%+ t0en buscar $= 8A+9 else if a^1clave / ele2 t0en buscar $= buscar'a^1der, ele2( else if a^1clave - ele2 t0en buscar $= buscar'a^1izq, ele2( else buscar $= TR* end;

" #nserci$n :a insercin tampoco es complicada. $s ms, resulta practicamente id7ntica a la bsqueda. 6uando se lle"a a un rbol vaco se crea el nodo en el puntero que se pasa como parmetro por referencia, de esta manera los nuevos enlaces mantienen la co!erencia. i el elemento a insertar 'a e&iste entonces no se !ace nada. 6odificacin en C: void insertar'tarbol **a, int ele2( { if '*a == N*++( { *a = 'arbol *( 2alloc'sizeof'arbol((; '*a(,-clave = ele2; '*a(,-izq = '*a(,-der = N*++; }

else if ''*a(,-clave / ele2( insertar':'*a(,-der, ele2(; else if ''*a(,-clave - ele2( insertar':'*a(,-izq, ele2(;

6odificacin en Pascal: .rocedure insertar'var a $tarbol; ele2 $ %nte&er(; be&in if a = N%+ t0en be&in ne6'a(; a^1clave $= ele2; a^1izq $= N%+; a^1der $= N%+; end else if a^1clave / ele2 t0en insertar'a^1der, ele2( else if a^1clave - ele2 t0en insertar'a^1izq, ele2( end;

" !orrado :a operacin de borrado si resulta ser al"o ms complicada. e recuerda que el rbol debe se"uir siendo de bsqueda tras el borrado. 5ueden darse tres casos, una ve( encontrado el nodo a borrar: +) $l nodo no tiene descendientes. implemente se borra. #) $l nodo tiene al menos un descendiente por una sola rama. e borra dic!o nodo, ' su primer descendiente se asi"na como !ijo del padre del nodo borrado. $jemplo: en el rbol de la fi"ura @ se borra el nodo cu'a clave es -+. $l rbol resultante es:

4) $l nodo tiene al menos un descendiente por cada rama. .l borrar dic!o nodo es necesario mantener la co!erencia de los enlaces, adems de se"uir manteniendo la estructura como un rbol binario de bsqueda. :a solucin consiste en sustituir la informacin del nodo que se borra por el de una de las !ojas, ' borrar a continuacin dic!a !oja. ;5uede ser cualquier !oja= 3o, debe ser la que conten"a una de estas dos claves: I la ma%or de las claves menores al nodo que se borra. uponer que se quiere borrar el nodo 4 del rbol de la fi"ura @. e sustituir la clave A por la clave #. I la menor de las claves ma%ores al nodo que se borra. uponer que se quiere borrar el nodo 4 del rbol de la fi"ura @. e sustituir la clave A por la clave @. $l al"oritmo de borrado que se implementa a continuacin reali(a la sustitucin por la ma'or de las claves menores, (aunque se puede esco"er la otra opcin sin

p7rdida de "eneralidad). 5ara lo"rar esto es necesario descender primero a la i(quierda del nodo que se va a borrar, ' despu7s avan(ar siempre a la derec!a !asta encontrar un nodo !oja. . continuacin se muestra "rficamente el proceso de borrar el nodo de clave A:

6odificacin en C: el procedimiento sustituir es el que desciende por el arbol cuando se da el caso del nodo con descencientes por ambas ramas. void borrar'tarbol **a, int ele2( { void sustituir'tarbol **a, tarbol **au5(; tarbol *au5; if '*a == N*++( 3* no e5iste la clave *3 return; if ''*a(,-clave / ele2( borrar':'*a(,-der, ele2(; else if ''*a(,-clave - ele2( borrar':'*a(,-izq, ele2(; else if ''*a(,-clave == ele2( { au5 = *a; if ''*a(,-izq == N*++( *a = '*a(,-der; else if ''*a(,-der == N*++( *a = '*a(,-izq; else sustituir':'*a(,-izq, :au5(; 3* se sustituye por la 2ayor de las 2enores *3 free'au5(; } }

void sustituir'tarbol **a, tarbol **au5( { if ''*a(,-der )= N*++( sustituir':'*a(,-der, au5(; else { '*au5(,-clave = '*a(,-clave; *au5 = *a; *a = '*a(,-izq; } } 6odificacin en Pascal: .rocedure ;orrar'var a $ tarbol; ele2 $ %nte&er(; <ar au5 $ tarbol;

.rocedure sustituir'<ar b $ tarbol(; be&in if b^1der /- N%+ t0en sustituir'b^1der( else be&in au5^1clave $= b^1clave; au5 $= b; b $= b^1izq; end end; be&in if a = N%+ t0en e5it { No e5iste la clave } else if a^1clave / ele2 t0en borrar'a^1der, ele2( else if a^1clave - ele2 t0en borrar'a^1izq, ele2( else be&in au5 $= a; if a^1izq = N%+ t0en a $= a^1der else if a^1der = N%+ t0en a $= a^1izq else sustituir'a^1izq(; { se sustituye por la 2ayor de las 2enores } dispose'au5( end end;

!"ercicio resuelto
$scribir una funcin que devuelva el numero de nodos de un rbol binario. Una solucin recursiva puede ser la si"uiente: funcion nodos(arbol : tipo.rbol) : devuelve enteroinicio si arbol J vacio entonces devolver *en otro caso devolver (+ K nodos(subarbolLi(q) K nodos(subarbolLder))fin .daptarlo para que detecte si un rbol es perfectamente equilibrado o no.

#roblemas propuestos
&rboles binarios' %M$ NC. ($nunciado) ( olucin)

$plicacin prctica de un rbol


e tiene un fic!ero de te&to . 6MM. 5ara este propsito puede servir cualquier libro electrnico de la librera 1utenber" o 6ervantes, que suelen tener varios cientos de miles de palabras. $l objetivo es clasificar todas las palabras, es decir, determinar que palabras aparecen, ' cuantas veces aparece cada una. 5alabras como Oni8oO-Oni8aO, Oven"oO-OvienesO etc, se consideran diferentes por simplificar el problema.

$scribir un pro"rama, que recibiendo como entrada un te&to, realice la clasificacin descrita anteriormente. $jemplo: ?e&to: Pa bOa c. !ola, adios, !olaP :a salida que produce es la si"uiente: a# adios + b+ c+ !ola # 3tese que el empleo de una lista enla(ada ordenada no es una buena solucin. i se obtienen !asta #*.*** palabras diferentes, por decir un nmero, locali(ar una palabra cualquiera puede ser, ' en "eneral lo ser, mu' costoso en tiempo. e puede !acer una implementacin por pura curiosidad para evaluar el tiempo de ejecucin, pero no merece la pena. :a solucin pasa por emplear un rbol binario de bsqueda para insertar las claves. $l valor de lo"(#*.***) es apro&imadamente de +A. $so quiere decir que locali(ar una palabra entre #*.*** llevara en el peor caso unos +A accesos. $l contraste con el empleo de una lista es simplemente abismal. 5or supuesto, como se !a comentado anteriormente el rbol no va a estar perfectamente equilibrado, pero nadie escribe novelas manteniendo el orden le&ico"rfico (como un diccionario) entre las palabras, asi que no se obtendr nunca un rbol mu' de"enerado. :o que est claro es que cualquier evolucin del rbol siempre ser mejor que el empleo de una lista. 5or ltimo, una ve( reali(ada la lectura de los datos, slo queda !acer un recorrido en orden central del rbol ' se obtendr la solucin pedida en cuestin de se"undos. Una posible definicin de la estructura rbol es la si"uiente: $n C: typedef struct tarbol { c0ar clave=>A?.A+A;RA@; int contador; 3* nu2ero de apariciones1 %niciar a A *3 struct tarbol *izq, *der; } tarbol;

$n Pascal: Type tArbol = ^tNodo; tNodo = R !"R# !lave $ 9trin&; contador $ %nte&er; { nu2ero de apariciones1 %niciar a A } %zq, #er $ tArbol; end;