Estructuras de Datos Avanzadas - · PDF file... Datos organizados por Posición Pilas ,...
Transcript of Estructuras de Datos Avanzadas - · PDF file... Datos organizados por Posición Pilas ,...
1
Metodología de Programación
TEMA
6
TEMA
6
Estructuras de DatosAvanzadas
Contenido del Tema
6.1. Introducción6.2. Pilas6.3. Colas6.4. L istas6.5. Arboles Binar ios. Arboles Binar ios de Búsqueda6.6. Otras Estructuras.
Metodología de Programación
Introducción
Objetivos• Especificación e Implementación de nuevas
estructuras de datos Técnica: Abstracción deDatos
• Tipos de Estructuras de Datos:
1) Datos organizados por Posición Pilas , Colasy Listas
2) Datos organizados por Valor Arboles Binarios
2
Metodología de Programación
Introducción
• Estudio de las Estructuras de Datos:
DefiniciónDefinición de la Estructura de Datos eidentificación de su Conjunto de Conjunto de OperacionesOperaciones
Desarrollo de diversas ImplementacionesImplementaciones
Presentación de AplicacionesAplicaciones
Metodología de Programación
Pilas
DefiniciónDefinición
•• Pila:Pila: Grupo Ordenado, (deacuerdo al tiempo que llevanen la pila) de ElementosHomogéneos (todos delmismo tipo).
•• Acceso a la Pila:Acceso a la Pila: añadir yeliminar elementos, SÓLO através de la CABEZA de laPila
• Estructura LIFOLIFO (LLast InputFirst Output)
� � � �
� � � � � �
Añadir Eliminar
3
Metodología de Programación
Pilas. Operaciones
Conjunto de OperacionesConjunto de OperacionesMÓDULO MPila
DEFINICIÓN
TIPOS
TElemento = // cualquier tipo de datos
TPila = // por definir
PROC MeterPila ( ↓↑pila: TPila ; ↓elem : TElemento )
// Añade un elemento por la cabeza de la pila
PROC SacarPila ( ↓↑pila: TPila ; ↑elem : TElemento )
// Saca un elemento por la cabeza de la Pila
Metodología de Programación
Pilas. Operaciones
Conjunto de OperacionesConjunto de OperacionesFUNC CrearPila (): TPila
// Crea una pila vacía
FUNC PilaVacia ( ↓pila : TPila ): LÓGICO
// Nos dice si una pila está vacía
FUNC PilaLlena ( ↓pila: TPila ): LÓGICO
// Nos dice si una pila está llena.
PROC DestruirPila ( ↓↑ pila: TPila )
// Destruye una pila previamente creada
Fin
4
Metodología de Programación
Pilas. Implementación
ImplementaciónImplementación1) Con un Ar ray• Array estructura adecuada Elementos Homogéneos
• Elementos almacenados de forma Secuencial
CONSTANTES
MAXPILA ← 100
TIPOS
TEle mento = ENTERO
TPil a = ARRAY[ 1..MA XPILA ] DE TEleme nto
Metodología de Programación
Pilas. Implementación
Sólo es posible acceder a la Cabeza de la Pila
¿ Cómo es posible conocer la posición de la cabeza?
1) Variable entera “cabeza” Inconveniente: se ha de pasarcomo parámetro adicional a todas las operaciones sobre lapila
2) Extender el array, en pila[0] almacenaremos el índice del
elemento que ocupa la cabeza actual
5
Metodología de Programación
CONSTANTES
CABEZA ← 0
MAXPILA ← 100
TIPOS
TPila = ARRAY[CABEZA..MAXPILA] DE TElemento
Pilas. Implementación
[0] [1] [2] [3][0] [1] [2] [3] [99] [100][99] [100]
� � � �
33 55 33 22..............
� � � � � �� � � � � �
223355
� � � � � �� � � � � �
Metodología de Programación
Pilas.Implementación
• Inconveniente: Solo es posible implementar una pila deenteros (no de cualquier otro tipo de datos)
• Solución: CONSTANTES MAXPILA ← 100 TIPOS TEl ement o= // cual quie r tip o de datos TPi l a=REGISTRO
Cab eza: NATURAL Ele mento s: ARRAY[ 1..M AXPIL A] DE
TEle ment o
1 1 2 2 k k MAXPILAMAXPILA55 1313 88 ..................kk
� � � � � �� � � � � � � � � � � ! " #� � � � � ! " #
6
Metodología de Programación
Pilas.Implementación
IMPLEMENTACI ÓN
FUNC Cr earP i la() : TPil a
VARIABL ES
pila : TPil a
IN I CIO
pila . Cabeza ← 0
RESULTADO ← pila
FI N
FUNC Pi l aVacia( ↓pil a:TP i la
): LÓGICO
IN I CIO
RESULTADO←pi la.C abeza =0
FI N
FUNC Pi l aLl ena( ↓pil a:TP i la
): LÓGICO
IN I CIO
RESULTADO ←( pila . Cabeza = MAXPILA)
FI N
PROCDestrui r Pil a( ↓↑pi la:T Pila)
IN I CIO
// No h ay q ue ha cer n ada.
FI N
Metodología de Programación
Pilas.Implementación
PROC SacarP i la( ↓↑pila : TPil a;
↑ele m:TEl ement o)
IN I CIO
elem ← pi la. Eleme ntos[p i la.C abez a]
pila . Cabeza←pila . Cabeza-1
FI N
/* precondición:
la pila no ha de estar vacía
* /
PROC Me t erP i la( ↓↑pila : TPil a;
↓el em :T Eleme nto)
IN I CIO
pila . Cabeza←pila . Cabeza+1
pila . Elementos
[p i la.C abez a] ← el em
FI N
/* precondición:
la pila no ha de estar llena
* /
7
Metodología de Programación
PROC MeterPi l a ( ↓↑pil a:TPila;
↓el em:TEleme nto;
↑l l ena : LÓGI CO)
Inic i o
l lena ←Pi laLlena( pila)
SI ( ¬l l ena) ENTONCES
pila. Cabeza ← pila.Cabez a + 1
pila. Elementos
[ pila.Cab eza] ← ele m
FINSI
Fin
/* Sin Prec ondición .I ntroduceun element o en la pil a sino e stá llena * /
Pilas.Implementación
PROC SacarPila ( ↓↑pil a:TPila ;
↑el em:TEleme nto;
↑vacia: LÓGICO)
INIC I O
vac i a ← PilaV acia(pila )
SI ¬¬vacia ENTONCES
elem ← pi la.Elemen t os
[ pila.Cab eza]
pila.Cabe za ←pila . Cabeza-1
FI NSI
FIN
/* Si n precond i ción . Sac a unelem ento de la pila si n oestá vacía*/
Metodología de Programación
Pilas.Implementación
2) Con una L ista Enlazada de Punteros• Comienzo de una lista enlazada Cabeza de la PilaTI POS
TEle mento = // cual quier tipo de d atosTPil a = PUNTERO A TNodoPilaTNodoPila = REGIST RO
dat o: TEleme nto si g: TPila FI NREGI STRO
$ %$ % &&' ( ) * + (' ( ) * + (
, -, -..
8
Metodología de Programación
Pilas.Implementación
PROC Met erPil a( ↓↑pila: TPila ;↑el em: TE l ement o;↑l l ena: LÓGI CO)
VARIABL ES
nuev onodo : TP i la
IN I CIO
llen a ← FALSO
nuev onodo ←NUEVO(T NodoPila)
nuev onodo ^ . dato ← elem
nuev onodo ^ . sig ← pi la
pila ← nuev onodo
FI N
PROC Sac arPil a( ↓↑pila: TPila ;↑ele m :T Elem ento; ↑vac í a: LÓGICO)
VARIABL ESpt r : TP i la
IN I CIOvací a ← Pi l aVací a(p i la)
SI ¬vac í a ENTONCES
el em ← pi l a^ .dat o
pt r ← pil a
pi l a ← pi l a^ .sigELI MINAR(pt r )
FINSIFI N
Metodología de Programación
Pilas.Implementación
PROC Cr earP i la() : TPil a
IN I CIO
RESULTADO ← NULO
Fi n
FUNC Pi l aVacia(p i la : TPila
): LÓGICO
IN I CIO
RESULTADO ← (pil a= NULO)
FI N
PROC De stru i rPil a( ↓↑pi la:T Pila )
Var iabl es
ptr: TPil a
In i cio
MIENTRAS( pila ≠ NULO) HACER
pt r ← pil a
pi l a ← pi l a^.s i g
ELI MINAR(pt r )
FINMI ENTRAS
FI N
9
Metodología de Programación
Pilas. Aplicaciones
AplicacionesAplicaciones
•• Ejemplo1Ejemplo1: Leer una secuencia de caracteres desde teclado: Leer una secuencia de caracteres desde tecladoe imprimirla al revése imprimirla al revés
•• Ejemplo2Ejemplo2: Verificar si una cadena de caracteres está: Verificar si una cadena de caracteres estábalanceada en paréntesis o nobalanceada en paréntesis o no
abcabc((defgdefg((ijkijk))(l())(l(mnmn))opop))qrqr SISI
abc abc((defdef))))ghijghij((klkl)m)m NONO
•• Ejemplo3Ejemplo3: Reconocimiento del Lenguaje,: Reconocimiento del Lenguaje,
L={W$W´ / W es una cadena de caracteres y W´es suL={W$W´ / W es una cadena de caracteres y W´es suinversa}inversa} (Suponemos que $ no está ni en W ni en W´)(Suponemos que $ no está ni en W ni en W´)
Metodología de Programación
Pilas. Ejemplo1
ALGORITMO I nvers oDESDE MPila IMPORTA
TPil a, Crea r Pila ,Met erPi l a, Sa carPi l a,Pi l avac i a, Destr uirPi l a
CONSTANTESENTER ← CHR(13 )
TI POSTEle mento = CARÁCTER
VARIABL ESc : TElementopila : TP i lall,v : LÓGICO
IN I CIO
pila ← Crea r Pila ( )LEER( c)
MIENTRAS ( c≠ENTER) ∧( ¬l l ) HACER
Met erPi l a(p i la,c , ll)Leer(c)
FINMI ENTRAS Sacar Pila ( pila , c,v)
MIENTRAS( ¬Pi l aVacia(p i la)) HACER
SacarPi l a(p i la,c , v)Escribi r (c)
FINMI ENTRASDest r uirP i la(p i la)
FI N
10
Metodología de Programación
Pilas. Ejemplo2
ALGORI TMO Bal anceo
DESDE MPi la IMPORTA Crea r Pi l a, TP i la,Meter Pil a, S acar Pil a, P i laV aci a,Destr uir Pila
CONSTANTESENTER ← CHR( 13)
Ti pos
TEl emento = CARÁCTER
VARIABLES
c : TE l emento
pil a : TPi l a
bie n,l l , v : LÓGICO
I nici o
pil a ← Crear Pila ( )
bie n ← CI ERTO
LEER(c )
MI ENTRAS( bie n ∧∧ ( c≠ENTER)HACER
SI c= ‘ (’ ENTONCES
Meter Pil a(pi l a, c ,ll )
bi en ← ¬ll
EN OTRO CASO
SI c = ‘ ) ’ ENTONCES
Sacar Pil a(pi l a, c ,v)
bi en ← ¬v
FI NSI
FIN SI
LEER(c )
FI NMIENTRAS
SI bi en ∧ Pil aVaci a( pila ) ENTONCES
Esc r ib i r(“ cadena bal ance ada “)
EN OTRO CASO
Esc r ib i r(“ cadena no bala nceada” )
FI NSI
Destr uir Pila ( pi l a)
FI N
Metodología de Programación
Pilas. Ejemplo3Algo r itmo Leng uaje_LDESDE MPila IMPORTA TPi l a,
CrearPila , MeterPi l a,SacarPila , Destrui r Pila
CONSTANTESENTER ← CHR(13)
TIPOSTElemento = CARÁCTER
VARIABLESc1, c2 : TElementopila : TP i labien, ll, v : LÓGICO
Inic i opila ← Cr earPila( )
l l ← FALSOLEER(c1)MIENTRAS ( c1 ≠‘ $’) ∧( ¬ll) HACER
Mete r Pila(pil a,c1,ll)LEER( c1)
FINMIENTRAS
Leer(c1)
bien ← TRUEMIENTRAS ( bien ∧ (c1 ≠ENTER))
HACERSaca r Pila(pil a,c2,v)bien ← ( ¬v) ∧ ( c1=c2)/* H e podido sacar el
el emnto y conicide*/SI ( bien) ENTONCES Leer(c1)FINS I
FINMIENTRASSI (bien ∧
Pila Vacia(pil a)) ENTONCESEscr i bir(“ Si pertenece ” )
EN OTRO CASOEscr i bir (“No pertenece ” )
FINSIDestruirP i la(pila)
FIN
11
Metodología de Programación
Pilas. Aplicaciones
• Aplicaciones complejas que se pueden solucionar conpilas: Expresiones AlgebraicasExpresiones Algebraicas
Operadores: +, -, *, /
Operandos: Letras mayúsculas
•• Notación Notación InfijaInfija::• El operador binario está situado entre sus dos operandos
A+ B
• Inconveniente: Son necesarias reglas de precedencia y usode paréntesis para evitar ambigüedades A+B*C
Metodología de Programación
Pilas. Aplicaciones
Notación PrefijaNotación Prefija• El operador binario esta situado
justo antes de sus dosoperandos +AB
• Gramática:
<expr_pref>::=<letra>|<operador><expr_pref><expr_pref>
<letra> ::= A| B ....|Z
<operador> ::= + | - | * | /
• Ejemplos:
A+(B*C) +A*BC
(A+B)*C *+ABC
Notación Notación PostfijaPostfija• El operador binario está situado
justo después de sus dosoperandos AB+
• Gramática:
<exp_post>::=<letra>|<expr_post><exp_post><operador>
<letra> ::=A| B ....|Z
<operador> ::= + | - | * | /
• Ejemplos:
A+(B*C) ABC*+
(A+B)*C AB+C*
12
Metodología de Programación
Pilas. Aplicaciones
• Ventaja: Usando expresiones prefijas y postfijas no sonnecesarias reglas de precedencia, ni uso de paréntesis.
Las gramáticas que las generan son muy simples, y losalgoritmos que las reconocen y evaluan muy fáciles
• Ejemplo 4: Algoritmo que evalúa una expresión en notaciónPostfija
1)Usaremos una pila
2)La expresión postfija se almacenará en un array de caracteresy será correcta
3)Los operadores serán: +, -, * y /
4)Los operandos serán letras mayúsculas (a cada una lepodemos asignar un valor)
Metodología de Programación
Pilas. Ejemplo4
CONSTANTES
MAX ← 20
TI POS
TAr ray = ARRAY[1 . .MAX] DECARÁCTER
TEl ement o=ENTERO
FUNC Op eran do( ↓c:CA RACTER)
: ENTERO
VARIABL ES
res: ENTERO
IN I CIO
CASO c SEA
‘A ’ : r es ← 5
‘B ’ : r es ← 7
‘C ’ : r es ← - 1
‘D ’ : r es ← 11
EN OTRO CASO
r es ← 0
FINCASO
RESULTADO ← re s
FI N
13
Metodología de Programación
Pilas. Ejemplo4
FUNC Eval_post f ija( ↓exp: TAr r ay; ↓ultimo: NATURAL): ENTERO
DESDE MPil a I MPORTA TPi l a, CrearPi l a, MeterPi l a, SacarPil a,Dest r uirPila
Vari ablespila : TP i lai, op1, o p2, resul t : ENTEROc : CARÁCTERv,ll: LÓGICO
FUNC es_operad or( ↓c: CARÁCTER) : LÓGICOINIC I O
RESULTADO ← (c=`* ´ ) ∨ ( c=`/´) ∨ (c=`+ ´ ) ∨ (c=`-´}FIN
Metodología de Programación
Pilas. Ejemplo4
Inic i opila ← Cr earPila( )PARA i ← 1 HASTA ultimo HACER
c ← exp[i]SI es_operado r (c) ENTONCES
Saca r Pila(pil a,op2,v)Saca r Pila(pil a,op1,v)CASO c SEA
‘+’ : MeterPil a(pila,op 1+op2,ll)‘-’ : MeterPi l a(pila,o p1-op2,ll)‘*’ : MeterPi l a(pila,o p1*op2,ll)‘/’ : MeterPi l a(pila, op1/op2,ll )
FINCASOEN OTRO CASO
Mete r Pila(pil a, Operand o(c))FINS I
FINPARASacarPila ( pila,res ult)DestruirP i la(pila)RESULTADO ←← resul t
Fin
14
Metodología de Programación
Colas
DefiniciónDefinición• Cola: es un grupo ordenado (con respecto al tiempo que
llevan en él) de elementos homogéneos (todos del mismoTipo)
• Acceso: los elementos se añaden por un extremo (final) yse sacan por el otro extremo (frente)
• Estructura FIFO (First Input First Output)
/ 0 1 2 3 1/ 0 1 2 3 1 4 5 6 7 84 5 6 7 8 9 : ; : <9 : ; : <= > ? > @= > ? > @
Metodología de Programación
Colas. Operaciones
Conjunto de OperacionesConjunto de OperacionesMODULO MCola
DEFINICIÓN
TIPOS
TElemento =// cualquier tipo de datos
TCola = // por definir
FUNC CrearCola(): TCola // Crea una cola vacia
FUNC ColaVacia( ↓cola:TCola): LÓGICO
/* Operación lógica que nos dice si la colacontiene algún elemento o no*/
15
Metodología de Programación
Colas. Operaciones
FUNC ColaLlena( ↓cola:TCola): LÓGICO
/* Operación lógica que nos dice si la cola estállena o no */
PROC MeterCola( ↓↑cola: TCola; ↓elem: TElemento)
// Introduce un elemento al final de la cola/
PROC SacarCola( ↓↑cola: TCola; ↑elem: TElemento)
// Saca un elemento del frente de la cola
PROC DestruirCola( ↓↑cola:TCola)
// Destruye una cola previamente creada
Fin
Metodología de Programación
Colas. Implementación
ImplementaciónImplementación 1) Con un Array
• Se deja fijo el frente de la cola y se mueve el final a medida que seañaden nuevos elementos (Idem Pila)
• Las operaciones Meter, Crear, ColaVacia y ColaLlena se implementande una forma similar a sus análogas en Pilas
• La operación de Sacar es mas complicada: cada vez que saquemos unelemento de la cola se han de desplazar el resto una posición en elarray, para hacer coincidir el frente con la primera posición del array
• Ventaja Simplicidad
• Inconveniente Ineficiente (colas con muchos elementos o elementos grandes)
16
Metodología de Programación
Colas. Implementación
• Ejemplo:
A B C D E E E E E E E E E EA B C D E E E E E E E E E E
A B C D E E E E E E E E E EA B C D E E E E E E E E E E
F G H I J K LF G H I J K LL M N O P P P P P P P P P PL M N O P P P P P P P P P PMeter(Cola,” A” )Meter(Cola,” A” ) QQ
R S T U V V V V V V V V V VR S T U V V V V V V V V V VQQ WWMeter(cola, “ B” )Meter(cola, “ B” ) X Y Z [ \ ] ^X Y Z [ \ ] ^
Sacar(cola, Sacar(cola, elemelem))WW
_ ^ ` a b b b b b b b b b b_ ^ ` a b b b b b b b b b bWW X Y Z [ \ ] _X Y Z [ \ ] _DesplazarDesplazar
Metodología de Programación
Solución:
• Utilizar un indice para el frente y otro para el final ypermitir que ambos fluctuen por el array
• Ventaja: operación Sacar más sencilla
• Inconveniente: Es posible que final sea igual a Maxcola(última casilla del array) y que la cola no esté llena
Colas. Implementación
17
Metodología de Programación
Colas. Implementación
• Ejemplo:
c d e f g g g g g g g g g gc d e f g g g g g g g g g gc d e f g g g g g g g g g gc d e f g g g g g g g g g gMeter(Cola,” A” )Meter(Cola,” A” ) hh
hh iiMeter(cola, “ B” )Meter(cola, “ B” )
j k l m n l o pj k l m n l o pj q m r s o pj q m r s o p
j k l m n l o pj k l m n l o pj q m r s o tj q m r s o t
p t u v w w w w w w w w w wp t u v w w w w w w w w w wxx yyMeter(cola, “ C” )Meter(cola, “ C” ) zz { | } ~ � } � �{ | } ~ � } � �{ � ~ � � � �{ � ~ � � � �
� � � � � � � � � � � � � �� � � � � � � � � � � � � ���Sacar(cola,Sacar(cola,elemelem)) zz { | } ~ � } � �{ | } ~ � } � �{ � ~ � � � �{ � ~ � � � �
Metodología de Programación
• Solución:
• Tratar al array como una Estructura CircularEstructura Circular , donde laúltima posición va seguida de la primera Evitamos queel final de la cola alcance el final físico del array y no estéllena
• Operación Meter Añade elementos a las posiciones delarray e incrementa el índice final
• Operación Sacar Más sencilla. Sólo se incrementa elíndice frente a la siguiente posición
Colas. Implementación
18
Metodología de Programación
Colas. Implementación
•• Ejemplo:Ejemplo:�� ����
������
����
�� ����
������
����
�� ����
������ �� � � � � � � � �� � � � � � � �
� � � ¡ � �� � � ¡ � �� � � � � � � �� � � � � � � �� � � ¡ � �� � � ¡ � �
�� ����
������
����
Meter(cola,” G” )Meter(cola,” G” )
¢¢ £ ¤ ¥ ¦ § ¥ ¨ ©£ ¤ ¥ ¦ § ¥ ¨ ©£ ª ¦ « ¬ ¨ £ ª ¦ « ¬ ¨ £ ¤ ¥ ¦ § ¥ ¨ ©£ ¤ ¥ ¦ § ¥ ¨ ©
£ ª ¦ « ¬ ¨ ®£ ª ¦ « ¬ ¨ ®
Sacar(cola,Sacar(cola,elemelem))
Metodología de Programación
Colas. Implementación
¯¯°°
±±©©®®
²²³³
Meter(cola,” L” )Meter(cola,” L” )
´´ µ ¶ · ¸ ¹ · º »µ ¶ · ¸ ¹ · º »µ ¼ ¸ ½ ¾ º ¿µ ¼ ¸ ½ ¾ º ¿
¿Como sabemos si la cola está vacía o llena?ÀÀ ÁÁ¿¿
»»ÂÂÃÃ
ÄÄÅŵ ¶ · ¸ ¹ · º »µ ¶ · ¸ ¹ · º »
µ ¼ ¸ ½ ¾ º Áµ ¼ ¸ ½ ¾ º Á´´ ÆÆ
ÇÇÈÈÉÉ
ÊÊ Ë Ë Ì Í Î Ï Î Î Ð Ñ Ï Ë ËË Ë Ì Í Î Ï Î Î Ð Ñ Ï Ë Ë
ÒÒ ÓÓÔÔ
ÕÕÖÖ×× ØØ
ÒÒ ÓÓÔÔ
ÕÕÖÖ×× Ù Ú Û Ü Ý Û Þ ÕÙ Ú Û Ü Ý Û Þ Õ
Ù ß Ü à á Þ ÔÙ ß Ü à á Þ ÔÙ Ú Û Ü Ý Û Þ ÔÙ Ú Û Ü Ý Û Þ ÔÙ ß Ü à á Þ ÔÙ ß Ü à á Þ Ô Sacar(cola,Sacar(cola,elemelem))
â â ã ä å æ ç æ è é æ â ââ â ã ä å æ ç æ è é æ â â
19
Metodología de Programación
Colas. Implementación
• Solución:• 1) Disponer de otra variable Contabilizará los
elementos almacenados en la cola
Variable=0 Cola vacía
Variable=MaxCola Cola llena
Inconveniente: añade más procesamiento a las operacionesMeter y Sacar
• 2) Frente apunte a la casil la del array que precede a la delelemento frente de la cola Solución elegida
Metodología de Programación
Colas. Implementación
• Ejemplo:êê ëëìì
ííîîïï
ððññò ó ô õ ö ô ÷ íò ó ô õ ö ô ÷ íò ø õ ù ú ÷ ïò ø õ ù ú ÷ ï
êê ëëìì
ííîîïï
ððññ
Meter(cola,” G” )Meter(cola,” G” )
ûû ò ó ô õ ö ô ÷ íò ó ô õ ö ô ÷ íò ø õ ù ú ÷ êò ø õ ù ú ÷ ê
¿Como saber si la cola está llena?¿Como saber si la cola está llena? Es necesario que la posición a la Es necesario que la posición a laque apunta frente en cada momento este que apunta frente en cada momento este ReservadaReservada
Cola Llena: Cola Llena: finalfinal++1 =frente1 =frenteêê ëëìì
ííîîïï
ððññò ó ô õ ö ô ÷ ìò ó ô õ ö ô ÷ ì
ò ø õ ù ú ÷ ëò ø õ ù ú ÷ ëüü ýý
þþÿ � �ÿ � �
20
Metodología de Programación
Colas. Implementación
¿Como saber si la cola está vacía?
Cola Vacía: Frente = Final
• Crear la cola (inicializarla vacía): frente =Maxcola (índicedel array que precede al elemento frente de la cola) yfinal=Maxcola Cola Vacía correcto (frente = final)
�� ����
������
��
�� ����
������ � � � � � � � � � �
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Sacar(cola,Sacar(cola,elemelem))
� � � �
Metodología de Programación
Colas. Implementación
• Agrupamos en un registro los índices frente y final, juntocon el array que contendrá los elementos de la cola
CONSTANTESMAXCOLA ← 100
TI POSTEle mento = // Cua l quie r tip o de dato sTCol a = REGIST RO
e l ement os: ARRAY[ 1..M AXCOLA] DE TElemento F r ente , Fina l : [ 1.. MAXCOLA]FI NREGI STRO
1 1 2 2 MaxColaMaxCola55 1313 ......................................
� � � � � �� � � � � �
� � � � �� � � � ���
MaxcolaMaxcola
21
Metodología de Programación
Colas. Implementación
FUNC Cr earC ola() : TCol a
VARIABL ES
cola : TCol a
IN I CIO
cola . Fren t e ← MAXCOLA
cola . Fina l ← MAXCOLA
RESULTADO ← co l a
FI N
PROC De stru i rCol a( ↓↑cola
:T Cola )
IN I CIO
// No h ay q ue ha cer n ada.
FI N
FUNC Co l aLl ena( ↓col a:Tc ola
): LÓGICO
IN I CIO
RESULTADO ←(c ola.F i nal MOD MAXCOLA)+ 1
= cola. Fren t e
FI N
FUNC Co l aVacia( ↓col a:Tc ola
): LÓGICO
IN I CIO
RESULTADO←← col a.Fin al =cola . Fren t e
FI N
Metodología de Programación
Colas. Implementación
PROC Met erC ola( ↓↑cola : TCol a;
↓ele m:TEl ement o)
VARIABL ES
f i n: NATURAL
IN I CIO
fin ← ( col a.Fi nal M OD
MAXCOLA) + 1
cola . Fina l ← f i n
cola . elem entos [ fin ] ←elem
FI N
PROC SacarC ola( ↓↑cola : TCol a;
↑ele m:TEl ement o)
VARIABL ES
i ni: NATURAL
IN I CIO
ini ← (col a.Fr ente MOD MAXCOLA) + 1
cola . Fren t e ← i ni el em←co l a.el ement os[in i ]
FI N
22
Metodología de Programación
Colas. Implementación
2) Con listas enlazadas con Punteros
• Usamos dos variables de tipo puntero, frente y final, queapunten a los nodos que contienen los elementos frente yfinal
• ¿Que sucedería si intercambiáramos las posiciones defrente y final en la lista enlazada?
� �� � !!
" # $ % & $" # $ % & $ " ' % ( )" ' % ( )
Metodología de Programación
Colas. Implementación
• Agrupamos las variables frente y final en un registro
TI POS
TEle mento = // cua l quie r tip o de dato sTPunt ero = PUNTERO A T NodoTNodo = REGIST RO
va l or : TEl ement osi g : TPunt ero
FIN REGISTROTCol a = REGIST RO
Fr ente : TP unter oFi nal : TPuntero
FIN REGISTRO
* +* + ,,--
. / 0 1 2 0. / 0 1 2 0 . 3 1 4 5. 3 1 4 5
23
Metodología de Programación
Colas. Implementación
FUNC CrearCola ( ): TCola
VARIABLES
cola:TCol a
INIC I O
cola. Frente := NULO
cola. Final := NULO
RESULTADO ← cola
FIN
FUNC ColaVacia ( ↓cola:
TCola ) : LÓGICO
INIC I O
RESULTADO ←cola. Frente = NULO
FIN
PROC DestruirC ola( ↓↑cola :TCola )
Vari ablesnodo,sgte : TPuntero
Inic i o
SI (c ola.Frente ≠NULO) ENTONCESsgte ← cola.Fr ente
MIENTRAS ( sgte ≠NULO) HACERnodo ← sg t esgte ← sg t e^.sigELIMI NAR(nodo)
FINMIENTRASFINSI
cola . Frente ← NULOcola . Final ← NULOFIN
Metodología de Programación
Colas. Implementación
PROC MeterCola ( ↓↑cola:TC ola;↓elem : TElemento )
VARIABLESptr: TPun t ero
Inic i optr ← NUEVO( TNodo)ptr ^. valor ← elemptr ^s ig ← NULOSI ColaVa cia(cola)
ENTONCEScola. Frente ← ptr
EN OTRO CASOcola. Final ^ .sig ← ptr
FINSIcola.Fina l ← nuevonodo
FIN
PROC SacarCola ( ↓↑cola:T Cola;
↑elem : TElemento )VARIABLES
t emp : Ti poPunteroINIC I O
t emp ← cola.Fr ente
elem ← cola.Fr ente ^. valorcola.Fren t e ←
cola. Frente ^ .sigSI (cola. Frente= NULO)
ENTONCES
cola. Final ← NULOFINSIELIMINAR ( t emp)
FIN
24
Metodología de Programación
Colas. Aplicaciones
Ejemplo: Reconocimiento del lenguaje. L={W$W/W es una cadena que no contiene a$}Algo r itmo Leng uaje_LDESDE MCola IMPORTA TCola, CrearCola, ColaVa cia, Sa carCola,
Mete r Cola, Des t ruirColaCONSTANTES
ENTER ← CHR(13 )TIPOS
TElemento = CARÁCTERVARIABLES
bien : LÓGICOc1,c2 : T Elementocola : TC ola
INIC I O col a ← Cr earCola() LEER(c1) MIENTRAS (c1 ≠ ‘$’) HACER MeterCola ( cola,c1)
LEER(c1)
FIN MIENTRAS
Metodología de Programación
Colas. Aplicaciones
Leer(c1)bien ← CIERTOMIENTRAS ( bien ∧ (c 1≠ENTER) HACER
SI Col aVacia(c ola) ENTONCESbien ← FALSE
EN OTRO CASOSacar Cola(cola, c2)SI (c 1 ≠c2) ENTONCES
bien ← FALSEEN OTRO CASO
LEER(c1)FINSI
FINSIFINMIENTRASSI (bien ∧ ColaVaci a(cola)) ENTONCES
Escri bir(“Pert enece”)EN OTRO CASO
Escri bir(“No p ertenece”)FINSIDestruirC ola(cola)
FIN
25
Metodología de Programación
Listas
• Definición de lista
• Implementación - Estática
- Dinámica
Metodología de Programación
Listas
• Definición: Una lista es una colección de elementoshomogéneos (del mismo tipo), con una relación lineal entreellos.
• Los elementos pueden o no estar ordenados con respecto aalgún valor y se puede acceder a cualquier elemento de lalista.
• En realidad, las pilas y colas vistas en secciones anterioresson listas, con algunas restricciones.
26
Metodología de Programación
Operaciones sobre listas:Crear
¿Esta vacía?
¿Está llena?
Insertar un elemento
Eliminar un elemento
Impr imir
Destruir
Listas
- De forma ordenada
- De forma no ordenada
Metodología de Programación
Listas
MÓDULO Mlistas
DEFINICIÓN
TIPOS
TElemento =/ / cualquier tipo de datos
TLista = // por definir
FUNC Crea r Lista():T Lista
FUNC List aVacia( ↓li s ta:TLista ) : LÓGICO
FUNC List aLlena( ↓li s ta:TLista ) : LÓGICO
PROC Inse r tarLista( ↓↑lista:TL i sta; ↓ele m:TElement o)
PROC Elim i narLista( ↓↑Lista:TL i sta; ↓ele m:TElement o)
PROC Impr i mirLista( l ista:TLis t a)
PROC Dest r uirLista( ↓↑lista: T Lista)
IMPLEMENTACIÓN
.... . .........
Fin
27
Metodología de Programación
Listas
• Implementación:
– Representación secuencial
– Representación enlazada- Dinámica
- Estática
Metodología de Programación
Listas
Dinámicas
• Utilizaremos punteros para crear la lista enlazada deelementos.
• Las definiciones de tipos y la implementación de lasoperaciones se han visto.
28
Metodología de Programación
Listas
Estáticas• Array de registros:
• Elemento.
• Enlace al siguiente elemento.
• Los registros pueden almacenarse en cualquier ordenfísico y se enlazarán a través del campo enlace.
Metodología de Programación
29
Metodología de Programación
Listas
• Inconveniente Variable estática Elección de Tamaño Máximo
• Debemos escribir nuestros propios algoritmos de manejo de memoria
No disponemos de NUEVONUEVO y ELIMINARELIMINAR .
• En el array de registros coexistirán dos listas:
- Nuestra lista enlazada de elementos.
- Una lista enlazada con el espacio libre disponible.
Metodología de Programación
Listas
30
Metodología de Programación
Listas
Consideraciones• El cero (o cualquier otro valor distinto de [1..10]) hará las
funciones de NULONULO en las listas enlazadas con punteros.
• Cuando no existe ningún elemento en la lista (lista vacía)sólo existirá la lista libre, que enlaza todas las posicionesdel array.
• Si la lista se llena, no tendremos lista libre.
• Para simular el manejo de memoria real medianteasignación dinámica de memoria, consideramos el array yla variable LibreL ibre como globales al módulo deimplementación de la lista.
MÓDULO Mlistas
DEFINICIÓN
CONSTANTES
VALOR_NULO ← 0 // Hace l as funcion es de NULO
MAX ← 100
TIPOS
TLista = [ 0..Max]
TElemento = // cual quier tipo de datos
TNodo = REGISTRO
eleme nto : TEle mento
sig : TLista
FINREGISTRO
FUNC Crea r Lista():T Lista
FUNC List aVacia( ↓li s ta:TLista ) : LÓGICO
PROC List aLlena( ↓li s ta: TList a): LÓGICO
PROC Impr i mirLista( ↓lista: TL i sta)
PROC Inse r tarLista( ↓↑lista:TL i sta; ↓ele m:TElement o)
PROC Elim i narLista( ↓↑lista:TL i sta; ↓ele m:TElement o)
PROC Dest r uirLista( ↓↑lista:TL i sta)
Metodología de Programación
31
IMPLEMENTACIÓN
TIPOS
TMemoria = ARRAY [1 . .MAX] DE TNodo
VARIABLES
memoria : TMemoria
l ibre : T Lista
FUNC CrearList a():TLista
INIC I O
RESULTADO ←← VALOR_NULOFIN
FUNC ListaVaci a( ↓lista:T Lista): LÓGICO
INIC I O
RESULTADO ←← (l i sta = VAL OR_NULO)
FIN
FUNC ListaLlen a( ↓lista:T Lista): LÓGI CO
INIC I O
RESULTADO ←← (l i bre = VAL OR_NULO)
FIN Metodología de Programación
FUNC NuevoNodo ( ): Tlista
VARIABLES
ptr: TLista
INICI O
ptr ← libr e
SI (p t r ≠ Nul o) ENTONCES
libre ← memoria[ptr] . sig
FINSI
RESULTADO ← ptr
FIN
PROC EliminarN odo ( ↓↑p : TLista)
INICI O
memori a[p].sig ← li bre
lbre ← p
p ← VALOR_NULO
FIN
Para los proce dimientos NUEVONUEVO y ELI MINARELI MINAR,nece s itamos an t es implem entar las operacione s(Nue voNodo, El i minarNodo ) equivale ntes a las queusamos al trab ajar con m emoria din ámica.
Metodología de Programación
32
PROC ImprimirL i sta( ↓list a : TLista )
VARIABLES
ptr : TLista
INIC I O
ptr ← lis t a
MIENTRAS ( ptr ≠ VALOR_NULO) HACER
Escri bir(memori a[ptr].el emento)
ptr ← memor ia[ ptr ]. s ig
FINMI ENTRAS
FIN
PROC InsertarL i sta( ↓↑lis t a: TLista ; ↓elem: T Elemento)
VARIABLES
ptr : TLista
INIC I O
ptr ← NuevoNodo()
SI (p t r ≠ VALOR_NULO) ENTONCES
memor ia[ptr].e l emento ← elem
memor ia[ ptr ].s i g ← lista
list a ← pt r
FINSI
FIN
Depende de TElemento
Metodología de Programación
PROC EliminarL i sta ( ↓↑li s ta: TList a; ↓elem : TElemento)
VARIABLES
pav, pret : TLista
INIC I O
pav ← lis t a // pu ntero avan zado
pret ← Nul o // pu ntero retr asado
MIENTRAS (memor ia[pav].e l emento ≠ elem) HACER
pret ← pav
pav ← memor ia[pav]. s ig
FINMI ENTRAS
SI (p r et = VAL OR_NULO) ENTONCES
lista ← memoria[lis t a].sig
EN OTRO CASO
memor ia[pret]. s ig ← memoria[ pav].sig
FINSI
Elimi narNodo(p av)
Fin
Suponemos que elelemento a borrar
está en la lista
Metodología de Programación
33
PROC Dest r uirLista( ↓↑lista: T Lista)
Variables
aux: TLista
I NICIO
MIENTRAS (list a ≠ VALOR_NULO) HACER
aux ← list a
lista ← memoria[lis t a] .sig
Elimi narNodo (au x)
FIN
FIN
INIC I O // Mlis t a
Li bre ← 1
PARA ptr ← 1 HASTA ( Max- 1) HACER
memoria [ ptr ] . si g ← pt r + 1
FINPARA
memoria [Max ] .enl ace ← VALOR_NULO
FIN // Mlist a
Metodología de Programación
Metodología de Programación
Listas enlazadas circulares
• Implementación estática o dinámica.
• El campo de enlace del último nodo apunta al primer nodode la lista, en lugar de tener el valor NULO.NULO.
• No existe ni primer ni último nodo. Tenemos un anillo deelementos enlazados unos con otros.
34
Metodología de Programación
Listas enlazadas circulares
• Es conveniente, aunque no necesario, tener un enlace(puntero o índice) al último nodo lógico de la lista. Asípodemos acceder facilmente a ambos extremos de lamisma.
• Una lista circular vacía vendrá representada por un valorNULO (o VALOR_NULO) .
p
Metodología de Programación
Listas enlazadas circulares
Ejemplo: (usando una implementación estática)Ejemplo: (usando una implementación estática)PROC Imprimir Lista( ↓lista:T Lista)VARIABLES
ptr : TLista
INIC I Optr ← listaSI ( ptr ≠ VALOR_NULO) ENTONCES
REPETIREscr i bir(memo r ia[ ptr ]. elemento)ptr ← memoria[ ptr ] . sig
HASTA QUE pt r = listaFINSI
Fin
35
Metodología de Programación
Listas enlazadas circulares
• Con una lista enlazada circular es muy fácil implementaruna Cola, sin tener que disponer de un registro con doscampos para el frente y para el final.
p
Frente Final
ImplementaciónImplementación
Metodología de Programación
Listas doblementeenlazadas
• Es una lista enlazada en la que cada nodo tiene al menostres campos:
- Elemento. El dato de la lista.- Enlace al nodo anterior.- Enlace al nodo siguiente.
• Los algoritmos para las operaciones sobre listasdoblemente enlazadas son normalmente más complicados.
• Pueden ser recorridas fácilmente en ambos sentidos.
ImplementaciónImplementaciónlista
36
Metodología de Programación
Listas doblementeenlazadas
• Una lista doblemente enlazada puede modificarse paraobtener una estructura circular de la misma
ImplementaciónImplementación
lista
Metodología de Programación
Listas
NIVEL DE UTILIZACIÓN
• Estructura muy utilizada.
•• Ejemplo:Ejemplo:
Manejo de tablas hash con el método de encadenamiento parael tratamiento de sinónimos.
– Utili zaríamos un array de listas como tabla hash. (Lo que en elprimer tema se llamó Encadenamiento)
– Las listas tienen como elementos cadenas de caracteres.
37
Modul o Mhash
DEFINICIÓN
DESDE MLista I MPORTA Tli s ta
CONSTANTES
MAXCAD ← 20
MAXELE ← 100
TIPOS
TCadena = ARRAY [0..MAX CAD-1] DE CARÁCTER
TElemento = TCa dena
TRango = [0. . MAXELE-1]
TTablaHas h= ARRAY TRango DE TLista
PROC Almacenamiento ( ↓↑tabla:T TablaHash; ↓dato:TEl emento)
FUNC Búsqueda( ↓tabl a:TTablaHa sh; ↓dato: TElemento) : LÓGICO
PROC Elim i nación( ↓↑t abla:TTab l aHash; ↓dato:TEleme nto)
Metodología de Programación
IMPLEMENTACIÓN
PROC Almacenamiento ( ↓↑tabla:T TablaHash; ↓dato:TEl emento)
I NICIO
Inser t ar(tabla [ Hash(dato ) ],dato)
FIN
FUNC Búsqueda( ↓tabl a:TTablaHa sh; ↓dato: TElemento) : LÓGICO
I NICIO
RESULTADO ← Buscar( t abla[Hash ( dato)],da t o)
FIN
PROC Elim i nación( ↓↑t abla:TTab l aHash; ↓dato:TEleme nto)
I NICIO
Elimi nar(tabla [ Hash(dato ) ],dato)
FIN
Fin (* Mhash *)
Metodología de Programación
38
Metodología de Programación
Árboles binarios
• Definición: es un conjunto finito de elementos que estávacío o está partido en tres subconjuntos disjuntos.
– El primer subconjunto contiene un único elemento llamadola raízraíz del árbol binario.
– Los otros dos subconjuntos son a su vez árboles binarios,llamados subárbolessubárboles izquierdoizquierdo y derechoderecho.
• El subárbol izquierdo o derecho puede estar vacío.
• Cada elemento de un árbol binario se denomina nodonodo.
Metodología de Programación
Árboles binarios
• Un método convencional para representar gráficamente unárbol binario es:
A
B C
D E F
G H I
•Consta de 9 nodos.
•• AA es el nodo raiz.
•El subárbol izquierdo tienecomo nodo raiz BB.
•El subárbol derecho tiene CCcomo raiz.
•La ausencia de ramas indicaun árbol vacío.
39
Metodología de Programación
Árboles binarios
• Si AA es la raíz de un árbol binario y BB es la raíz de su subárbol izquierdo oderecho, se dice que AA es el padrepadre de BB y BB es el hijohijo izquierdoizquierdo oderechoderecho de AA.
• Un nodo que no tiene hijos se denomina nodo hojahoja.
• Un nodo n1n1 es un antecesorantecesor de un nodo n2n2 (y n2n2 es un descendientedescendiente den1n1) si n1n1 es el padre de n2n2 o el padre de algún antecesor de n2n2.
• Un nodo n2n2 es un descendientedescendiente izquierdoizquierdo de un nodo n1n1 si n2n2 es el hijoizquierdo de n1n1 o un descendiente del hijo izquierdo de n1n1. Undescendientedescendiente derechoderecho se puede definir de forma similar.
• Dos nodos son hermanoshermanos si son los hijos izquierdo y derecho del mismopadre.
Metodología de Programación
Árboles binarios
•• Árbol Árbol estr ictamenteestr ictamente binar io binar io: árbol binario en que cada nodono-hoja tiene subárboles izquierdo y derecho no vacíos.
•• NivelNivel de un nodo en un árbol binar io de un nodo en un árbol binar io: La raíz tiene nivel 0, yel nivel de cualquier otro nodo en el árbol es uno más que elnivel de su padre.
•• ProfundidadProfundidad de un árbol binar io de un árbol binar io: máximo nivel de cualquierhoja del árbol.
•• Árbol binar io Árbol binar io completocompleto de profundidad de profundidad dd: árbol estrictamentebinario con todas sus hojas con nivel d.
la longitud del camino más largodesde la raiz hasta una hoja.
40
Metodología de Programación
Árboles binarios
Un árbol binario contiene m nodos en el nivel L.
Contiene como máximo 2mnodos en el nivel L+1.
Puede contener como máximo2L nodos en el nivel L
Un árbol binario completo deprofunfidad d contiene
exactamente 2L nodos en cadanivel L , entre 0 y d
El número total de nodos en un árbolbinario completo de profundidad d
es:
tn = 20 + 21 + 22 + ... + 2d = 2d+1 - 1
Metodología de Programación
Árboles binarios
Árbol ternar io: conjunto finito de elementos que está vacío oestá partido en cuatro subconjuntos disjuntos.
– El primer subconjunto contiene un único elemento llamado la raíz delárbol.
– Los otros tres subconjuntos son a su vez árboles.
Árbol n-ar io: conjunto finito de elementos que está vacío o estápartido en n+1 subconjuntos disjuntos.
– El primer subconjunto contiene un único elemento llamado la raíz delárbol.
– Los otros n subconjuntos son a su vez árboles.
41
Metodología de Programación
Árboles binarios
¿Esta vacío?
¿Está lleno?
Devolver el contenido del nodo raíz
Devolver el subárbol derecho
Devolver el subárbol derecho
Destruir
Operaciones sobre árboles:
Crear árbol vacío
Crear árbol dada su raíz,
y sus hijos derecho
e Izquierdo
Módulo MAr bolBi n
DEFINIC I ÓN
TIPOS
TEl ement o = // C ualqu i er t ipo de da t os
TAr bolB i n = PUNTERO A TNo doArb olBin
TNodoAr bolB i n = REGISTRO
dato : TEle mento
i zq,de r : T Arbol Bin
FI NREGI STRO
FUNC Crea r Arbo l Vaci o(): TArbo l Bin
FUNC Crea r Arbo l ( ↓raiz : TEle ment o; ↓i zq, ↓dch: T Arbo l Bin
) : TAr bolB i n
FUNC Arbo l Vaci o( ↓arbo l :TAr bolB i n): LÓGICO
FUNC Info ( ↓arbol : TArb olBin ) :TE l ement o
FUNC Izq( ↓ar bol: TArbo l Bin) : TAr bolB i n
FUNC Der( ↓ar bol: TArb olBin ) : T Arbol Bin
PROC Dest r uirA r bol ( ↓↑ar bol: TArbo l Bin)
Implementación dinámica
Metodología de Programación
42
IMPLEMENTACI ÓN
FUNC Crea r Arbo l Vaci o(): TArbo l Bin
INIC I O
RESULTADO ← NULO
FIN
FUNC Crea r Arbo l ( ↓raiz : TEle ment o; ↓i zq, ↓dch: T Arbo l Bin
) : TAr bolB i n
VARIABLES
ar bol : TAr bolBi n
INIC I O
ar bol ← NUEVO(TNo doAr bolBi n)
ar bol^. dato ← rai z
ar bol^. i zq ← izq
ar bol^. der ← dch
RESULTADO ← arbol
FIN
Metodología de Programación
FUNC Arbo l Vaci o( ↓arbo l :TAr bolB i n): LÓGICO
INIC I O
RESULTADO ← (arb ol = NULO)
FIN
FUNC Info ( ↓arbol : TArb olBin ) :TE l ement o
INIC I O
RESULTADO ← arbo l ^.d ato
FIN
FUNC Izq( ↓ar bol: TArbo l Bin) : TAr bolB i n
INIC I O
RESULTADO ← arbo l ^.i zq
FIN
FUNC Der( ↓ar bol: TArb olBin ) : T Arbol Bin
INIC I O
RESULTADO ← arbo l ^.d er
FIN
Metodología de Programación
43
PROC Dest r uirA r bol ( ↓↑ar bol: TArbo l Bin)
INIC I O
SI ( ¬Ar bolV acio ( arbo l )) ENTONCES
Destru i rArb ol(ar bol^. der)
Destru i rArb ol(ar bol^. i zq)
ELI MINAR(ar bol)
FI NSI
FIN
FI N // MAr bolBi n
Metodología de Programación
Módulo MAr bolBi nEstá t ico
DEFINIC I ÖN
CONSTANTES
VALOR_NULO ← 0
MAX ← 100
TIPOS
TAr bolB i n = [0.. MAX]
TNodoAr bolB i n = REGISTRO
dato : TEle mento
i zq,de r : T Arbol Bin
FI NREGI STRO
FUNC Crea r Arbo l Vaci o(): TArbo l Bin
FUNC Crea r Arbo l ( ↓raiz : TEle ment o; ↓i zq, ↓dch: T Arbo l Bin
) : TAr bolB i n
FUNC Arbo l Vaci o( ↓arbo l :TAr bolB i n): LÓGICO
FUNC Info ( ↓arbol : TArb olBin ) :TE l ement o
FUNC Izq( ↓ar bol: TArbo l Bin) : TAr bolB i n
FUNC Der( ↓ar bol: TArb olBin ) : T Arbol Bin
PROC Dest r uirA r bol ( ↓↑ar bol: TArbo l Bin)
Implementación estática
Metodología de Programación
Se deja propuesto como Se deja propuesto como ejercicio la de los procedimientos ejercicio la de los procedimientos y funciones para una implementación y funciones para una implementación estática de un arbol binar ioestática de un arbol binar io
44
Metodología de Programación
Árboles binarios
NIVEL DE UTILIZACIÓN• Estructura de datos muy útil cuando se deben tomar decisiones de "dos
caminos”
• Muy util izado en aplicaciones relacionadas con expresionesaritméticas.
Ejemplos:Ejemplos:
+
5 2
(12-3)* (4+1)
5 + 2
*
- +
12 3 4 1
Metodología de Programación
Ejemplo:Ejemplo:
Ti pos
Tipo Decis i on = (Op erado r , Op erand o)
TEle mento = REGIST RO
CASO c onten i do:T i poDecisi on SEA
Operad or:
oper: CARÁCTER
Operan do:
val: REAL
FI NCASO
FI NREGI STRO
Árboles binarios
Diseñemos un algor itmo para evaluar una expresiónar itmética que está almacenada en un árbol binar io.
45
FUNC Eval( ↓arb ol: TArbo l Bin ): REAL
VARIABLES
dato:TEle mento;
r esult: REAL
INIC I O
dato ← Info(ar bol)
SI (dato. contenido = Operando ) ENTONCES
resul t ← dato.val
EN OTRO CASO
CASO dato.oper SEA
'+': r esult ← Eval( I zq(arbol) ) +Eval(Der ( arbol))
'-': r esult ← Eval( I zq(arbol) ) -Eval(Der ( arbol))
'*': r esult ← Eval( I zq(arbol) ) *Eval(Der ( arbol))
'/': r esult ← Eval( I zq(arbol) ) /Eval(Der ( arbol))
FINCASO
FINSI
RESULTADO ← re sult
Fin
Metodología de Programación
Metodología de Programación
Árboles binarios debúsqueda
La estructura lista enlazada es lineal ¿Búsqueda?
La estructura árbol ¿Búsqueda más eficiente?
Siempre que los datos sedistribuyan de forma adecuada
Árbol binario de búsqueda
46
Metodología de Programación
Árboles binarios debúsqueda
• Definición: árbol binario en el que el subárbolizquierdo de cualquier nodo (si no está vacío) contienevalores menores que el que contiene dicho nodo, y elsubárbol derecho (si no está vacío) contiene valoresmayores.
Ejemplo: Ejemplo: H
F
E
B
A D
C
I
G
Metodología de Programación
Árboles binarios debúsqueda
Operaciones:
Crear
Buscar
Insertar
Suprimir
Imprimir
+ + Las definidas para unárbol binario general
47
Módul o MABBDefi nición
TIPOS
TRecor rido = ( I nOrden,Pr eOrden,Pos t Orden)
TClav e = ENTERO
TElemento = REGISTRO
clave : TClave..... . ...
FI NREGISTRO
TABB = PUNTERO A TNodoABB
TNodoABB = REGI STRO
izq,d er:TABB
elem: TElemento
FINREGISTRO
/ / Operac i ones típi cas de los árboles
FUNC Crea r ABB():TAB B
FUNC ABBVacio( ↓ar bol: TABB): LÓGI CO
FUNC Info ABB( ↓ar bol:T ABB): TEle mento
FUNC IzqA BB( ↓arb ol:TA BB): TABB
FUNC DerA BB( ↓arb ol: T ABB): TAB B
PROC Dest r uirA BB( ↓↑arbo l : TA BB)
Metodología de Programación
/ / Operac i ones Excl usivas de l os árbole s binarios de búsque da
PROC Busc arABB( ↓arb ol:TABB; ↓c:TClave; ↑dato:TEle mento;
↑EnAr bol: LÓGICO)
PROC Inse r tarABB( ↓↑arbol:TABB ; ↓dato:TE l emento)
PROC Supr i mirABB( ↓↑arbol:TABB ; ↓c:TClav e)
PROC Impr i mirABB( ↓ar bol:TABB; ↓rec:TRe corrido)
IMPLEMENTACIÓN
FUNC Crea r ABB():TAB B
I NICIO
RESULTADO ← NULO
FIN
FUNC ABBVacio( ↓ar bol: TABB): LÓGI CO
INIC I O
RESULTADO ← (arb ol = NULO)
FIN
FUNC Info ABB( ↓ar bol:T ABB): TEle mento
INIC I O
RESULTADO ← arbo l ^.d ato
FIN
Metodología de Programación
48
FUNC IzqA BB( ↓arb ol:TA BB): TABB
INIC I O
RESULTADO ← arbo l ^.i zq
FIN
FUNC DerA BB( ↓arb ol: T ABB): TAB B
INIC I O
RESULTADO ← arbo l ^.d er
FIN
PROC Dest r uirA BB( ↓↑arbo l : TA BB)
INIC I O
Destrui r ABB( arbo l ^.iz q)
Destrui r ABB( arbo l ^.dc h)ELIMI NAR(arbol )
FIN
Metodología de Programación
PROC Busc arABB( ↓arb ol:TABB; ↓c:TClave; ↑dato:TEle mento;
↑EnAr bol: LÓGICO)
/ / Soluci ón Iterati va
VARIABLES
ptrAr bol: TABB
ele:T Elemento
I NICIO
EnArb ol ← FALSO
ptrAr bol ← arbol
MIENTRAS (( ¬ABBVacio ( ptrAr bol)) ∧ ( ¬EnArbol ) ) HACER
ele = InfoABB(p t rArbol)
SI (e l e.clave = c) ENTONCES
EnArb ol ← CIERTO
dato ← ele
SINO SI (c < el e.clave) ENTONCES
ptrAr bol ← IzqABB(pt r Arbol)
EN OTRO CASO
ptrAr bol ← DechABB(p t rArbol)
FINSI
FINMI ENTRAS
FINMetodología de Programación
49
PROC Busc arABB( ↓arb ol:TABB; ↓c:TClave; ↑dato:TEle mento;
↑EnAr bol: LÓGICO)
/ / Soluci ón Recursi va
VARIABLES
ele:T Elemento
I NICIO
SI ( ABBVacio ( arbol) ) ENTONCES
EnArb ol ← FALSO
EN OTRO CASO
ele = InfoABB(a r bol)
SI (e l e.clave = c) ENTONCES
EnArb ol ← CIERTO
dato ← ele
SINO SI (c < el e.clave ) ENTONCES
Busca r ABB(IzqAB B(arbol),c , dato,EnAr bol)
EN OTRO CASO
Busca r ABB(DechABB(arbol), c ,dato,EnA r bol)
FINSI
FINSI
FIN
Metodología de Programación
Metodología de Programación
Árboles binarios debúsqueda
Consideraciones acerca de la operación de inserción.
F
E
D
B
A C G
D
C
B
A
F
G
E
B
A
D
C
F
E
G
Los mismos datos, insertados en ordendiferente, producirán árboles conformas o distribuciones de elementosmuy distintas.
Entrada: ABCDEFG
Entrada: DBFACEG
Entrada: BADCGFE
50
Metodología de Programación
Árboles binarios debúsqueda
PROC InsertarA BB( ↓↑arbol : TABB; ↓dat o:TElemen t o)
// S olución It erativa
VARIABLES
nuevonodo , pav,pret: TABB
clavenuev a:Tclave
ele:TElem ento
Inic i o
nuevonodo ← NUEVO( TNodoABB)
nuevonodo^.i zq ← NULO
nuevonodo^.d er ← NULO
nuevonodo^.e l em ← dato
cl avenueva ← dato . clave
pav ← ar bol // Pu ntero Avan zado
pr et ← NULO // Pu ntero Retr asado
Los mismos datos, insertados en ordendiferente, producirán árboles conformas o distribuciones de elementosmuy distintas.
Metodología de Programación
Árboles binarios debúsqueda
MIENTRAS ( pav ≠ NULO) HACER
pret ← pav
ele = pav^.ele m
SI (c l avenueva < ele.cla ve ) ENTONCES
pav ← pav ^ .izq // Voy hacia el hijo iz quierdo
EN OTRO CASO
pav ← pav ^ .dch // Voy hacia el hijo de r echo
FINSI
FINMIENTRAS
ele = pre t ^.elem
SI (clave nueva < el e.clave ) ENTONCES
pret ^.izq ← nuevo nodo // In serto en e l hijo izq uierdo
EN OTRO CASO
pret ^.dch ← nuevo nodo // In serto en e l hijo izq uierdo
FINSI
FIN
51
Metodología de Programación
Árboles binarios debúsqueda
PROC InsertarA BB( ↓↑arbol : TABB; ↓dat o:TElemen t o)VARIABLES
ele:T ElementoINIC I O // S olución R ecursiva
SI (ABBVacio ( arbol) ) ENTONCES arbol ← NUEVO(T NodoABB) arbol ^ .izq ← NULO arbol ^ .der ← NULO arbol ^ .elem ← dato
EN OTRO CASOele = InfoABB( arbol)SI (d ato.clave < ele.cla ve) ENTONCES
Inse r tarABB(ar bol^.izq, dato)EN OTRO CASO
Inse r tarABB(ar bol^.dch, dato)FINSI
FINSIFIN
Los mismos datos, insertados en ordendiferente, producirán árboles conformas o distribuciones de elementosmuy distintas.
¿¿Por qué usamos Por qué usamos arbol^.izq y y arbol^.dch en vez de en vez de IzqABB(arbol) y y DechABB(arbol ??
Metodología de Programación
Árboles binarios debúsqueda
Consideraciones acerca de la operación de supr imir .
• Pasos:
1) Encontrar el nodo a suprimir. Equivalente a Buscar
2) Eliminarlo del árbol. 3 casos
padre de x
x
ex-padre de x
Caso 1
52
Metodología de Programación
Árboles binarios debúsqueda
Caso 2
padre de x
x
hijo de x
ex-padre de x
ex-hijo de x
Q
L
J
B
N
R
M
K
P
Z
P
L
J
B
N
R
M
K
Caso 3z
Eliminar Q
PROC SuprimirA BB( ↓↑arbol : TABB; ↓c: TClave)VARIABLES // So l ución Ite r ativa
pav,pret: TABBINIC I O
pav ← arbolpret ← NULO //Bu sco el ele mentoMIENTRAS ( pav ≠ NULO) ∧ (p av^.elem.c l ave ≠ c) HACER
pret ← pavSI (c < pav^.e l em.clave) ENTONCES
pav ← pav^ . izqEN OTRO CASO
pav ← pav^ . derFINSI
FINMIENTRASSI (pav = NULO) ENTONCES
// No hacer Na da, ya que no hay na da que bor r arSINO SI ( pav = arbo l ) ENTONCES // equiv alente a: ( pret = NULO)
Supri mirNodo(a r bol)
SINO SI ( pret^.izq = pav) ENTONCESSupri mirNodo(p r et^.izq)
EN OTRO CASOSupri mirNodo(p r et^.der)
FINSIFIN
Metodología de Programación
53
PROC SuprimirN odo( ↓↑arb ol:TABB)
Vari ables // So l ución Ite r ativa
temp,ant: TABB
Inic i o
temp ← arbol
SI (arbol ^ .der = NULO) ENTONCES
arbo l ← arb ol^.izq // C asos sin Hijos ó s i n Hijo de r echo
SINO SI ( arbol^.iz q = NULO) ENTONCES
arbo l ← arb ol^.der // C aso de Só l o Hijo d erecho
EN OTRO CASO // C aso Hijos derecho y izquierd o
temp ← arbo l ^.izq // Busco el mayor hij o derecho del hijo i zquierdo
ant ← arbol
MIENTRAS (tem p^.der <> NULO) HACER
ante r ior ← t emp
temp ← temp ^.der
FINMI ENTRAS
arbo l ^.elem ← temp^. elem
SI ( anterior = arbol) ENTONCES
ante r ior^.izq ← temp ^.izq
EN OTRO CASO
ante r ior^.der ← temp ^.izqFINS I
FINSI
ELIMINAR ( t emp)FIN
0 o 1 hijo
1 hijo
2 hijos
Metodología de Programación
PROC SuprimirA BB( ↓↑arbol : TABB; ↓c: TClave)
// S olución Re cursiva
VARIABLES
ele:TElem ento
INIC I O
SI (ABBVacio ( arbol) ) ENTONCES
// No hacer Na da, ya que no hay na da que bor r ar
EN OTRO CASO
ele = InfoABB( arbol)
SI (e l e.clave = c) ENTONCES
Supri mirNodo(ar bol)
SINO SI (c < e l e.clave ) ENTONCES
Supri mirABB(arb ol^.izq,c )
EN OTRO CASO
Supr i mirABB(ar bol^.dch, c)
FINSI
FINSI
FIN
Metodología de Programación
¿¿Por qué usamos Por qué usamos arbol^.izq y y arbol^.dch en vez de en vez de IzqABB(arbol) y y DechABB(arbol ??
54
PROC SuprimirN odo( ↓↑arbo l :TABB) // Solución RecursivaVari ables
t emp:TABBele :TEle mentoFUNC Mayor HijoDerec ho( ↓arbol: TipoABBúsq ueda):TEle mentoI NICIO // Solución Recursiva
SI (A BBVacio(D chABB(arbo l ))) ENTONCESRESULTADO ← InfoABB ( arbol)
EN OTRO CASORESULTADO ← MayorHi j oDerecho( DchABB(arb ol))
FINSIFIN
INIC I OSI (arbol ^ .der = NULO) ENTONCES
temp ← ar bolarbol ← ar bol^.izq // Ca sos sin Hi j os ó sin Hijo derec hoELIMI NAR(temp)
SINO SI ( arbol^.izq = NULO) ENTONCEStemp ← ar bolarbol ← ar bol^.der // Ca so de Sólo Hijo dere choELIMI NAR(temp)
EN OTRO CASO // Ca so Hijos d erecho y i zquierdoele ← MayorHijoDere cho(IzqABB ( arbol))arbol ^ .elem ← eleSupri mirABB(ar bol^.izq,e l e.clave)
FINSIFIN
0 o 1 hijo
1 hijo
Metodología de Programación
Metodología de Programación
Árboles binarios debúsqueda
Consideraciones acerca de la operación de impr imir .
• Recorrer un árbol es "visitar" todos sus nodos para llevar acabo algún proceso como por ejemplo imprimir loselementos que contiene.
• ¿Cómo imprimir los elementos de un árbol? ¿en quéorden?.
55
Metodología de Programación
Árboles binarios debúsqueda
• Para recorrer un árbol binario en general (de búsqueda o no), podemoshacerlo de tres formas distintas:
a) Recorrido InOrden.
1) Recorrer el subárbol izquierdo en InOrden
Pasos: 2) "Visitar" el valor del nodo raiz y procesarlo
3) Recorrer el subárbol derecho en InOrden
b) Recorrido PreOrden.
1) "Visitar" el valor del nodo raiz y procesarlo
Pasos: 2) Recorrer el subárbol izquierdo en PreOrden
3) Recorrer el subárbol derecho en PreOrden
c) Recorrido PostOrden.
1) Recorrer el subárbol izquierdo en PostOrden
Pasos: 2) Recorrer el subárbol derecho en PostOrden
3) "Visitar" el valor del nodo raiz y procesarlo
PROC Imp_ I nOrd en( ↓arb ol:TA BB)
INIC I O
SI ( ¬ABBVacio( arbol ) ) ENTONCES
Imp_In Orden ( IzqA BB(ar bol) )
ImpNodo(Inf oABB(arbol ) )
Imp_In Orden ( DerABB(ar bol) )
FI NSI
FIN
PROC Imp_ PreOr den( ↓ar bol:T ABB)
INIC I O
SI ( ¬ABBVacio( arbol ) ) ENTONCES
ImpNodo(Inf oABB(arbol ) )
Imp_Pr eOrde n(Izq ABB(a r bol ) )
Imp_Pr eOrde n(Der ABB(a r bol ) )
FI NSI
FIN
Metodología de Programación
56
PROC Imp_ PostO r den( ↓ar bol: TABB)
INIC I O
SI ( ¬ABBVacio( arbol ) ) ENTONCES
Imp_PostOrd en(Iz qABB(arbo l ))
Imp_PostOrd en(Dc hABB(arbo l ))
ImpNodo(Inf oABB(arbol ) )
FI NSI
Fin
PROC Impr i mirA BB( ↓arb ol:TA BB; ↓re c:TRe corr i do)
Inic i o
CASE re c SEA
in orde n: Im p_InO r den( arbo l )
pr eord en: I mp_Pr eOrde n(ar bol)
postor den: I mp_PostOr den( arbol )
FI NCASO
Fin
Fi n (* MAr bolB i nari oBusqueda *)
Metodología de Programación
Metodología de Programación
Árboles binarios debúsqueda
Ejemplo:
• El recorrido InOrden mostraría: BFGHPRSTWYZ
• El recorrido PreOrden: PFBHGSRYTWZ
• El recorrido PostOrden: BGHFRWTZYSP
Y
T
P
F
B H
G
Z
W
R
S
57
Metodología de Programación
Árboles binarios debúsqueda
Nivel de utilización
• Aplicaciones en las que estén implicas operacionesde búsqueda de elementos
• Ejemplo: Supongamos que deseamos implementarun diccionario inglés/español en que la búsqueda dela traducción de una palabra inglesa sea rápida. Paraello podemos usar un árbol binario de búsqueda enel que el tipo elemento sea un registro con la palabraen inglés (que será la clave) y la palabra en español.
Metodología de Programación
Árboles binarios debúsqueda
ALGORITMO Dicc i onario
DESE MABB IMPORTA TABB, CrearABB , Dest r uirA BB, BuscarA BB,Inse r tarABB, S uprimirABB , Imprimir ABB
CONSTANTES
MAXCAD = 20
TIPOS
TCadena = ARRAY [0. . MAXCAD-1] DE CARÁCTER
TDic = TA BB
Tclave = TCadena
TElemento = REGISTRO
clave : TClave // Pa l abra ing l és
tradu cción: TCa dena // Pa l abra Espa ñol
FINREGISTRO
58
Metodología de Programación
Árboles binarios debúsqueda
PROC InsPalDic ( ↓↑d:Tdic; ↓pal: TEl emento)
INIC I O
I nsertarA BB(d,pal)
FIN
PROC BuscaPalD i c( ↓d:TDic ; ↓ingl és: TClave ; ↑pal: TElem ento;
↑enco ntrado: LÓGI CO)
INIC I O
BuscarAB B(d,inglés , pal,encon t rado)
FIN
PROC BorrarPal Dic( ↓↑d:TD i c; ↓ingl és:TClave)
INIC I O
Suprimir ABB(d,ingl és)
FIN
Metodología de Programación
Bibliografía6 7 8 9 : ; < = > ? 8 9 : ; @ A B : C : : D @ E F G F H I J K I L M
N J O P Q K O Q P I J R S T I O U J F E V W X Y Z [ ; Z \ ] \ ^ Y F _ ] ` a [ b cd \ e e f C Y g V a [ h V a \ ] [ Y [ Z V ; i j [ k [ @ l = < = F
6 7 m n D 9 o o ? m n D 9 A ; E @ : F H P U p P I q I K r s t S t u v v wx L p U P r O q U J y S J O P Q K O Q P I J R S R I O U J M U z { S O U J w _ ] ` a [ b d \ e e @
| o o o F6 7 E 9 } C o o ? E 9 } C G d @ ~ F � S J U L Q K r s t R S � P U z L S q I J K U t
u v v w E V W X Y Z [ ; Z \ ] \ ^ Y F � a V Y g \ ] V d [ e e @ | o o o F6 7 E � � n o l ? E � � n � E � � � � @ � F N L L S t p Q I { S R S
� P U p P I q I K r s t u v v F ; Z \ ] \ ^ Y ; i j V ] \ [ e @ 9 Z \ i i � Y c ~ V i e V B @| o o l F