Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Contenido del Tema
6.1. Introducción6.2. Pilas6.3. Colas6.4. Listas6.5. Arboles Binarios. Arboles Binarios de Búsqueda6.6. Otras Estructuras.
Metodología de la Programación. Curso 2002/03. Pág. 1
Metodología de la Programación. Curso 2002/03. Pág. 2
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 , Colas
y Listas2) Datos organizados por Valor Arboles Binarios
Metodología de la Programación. Curso 2002/03. Pág. 3
• Estudio de las Estructuras de Datos: DefiniciónDefinición de la Estructura de Datos e
identificación de su Conjunto de Conjunto de OperacionesOperaciones
Desarrollo de diversas ImplementacionesImplementacionesPresentación de AplicacionesAplicaciones
Metodología de la Programación. Curso 2002/03. Pág. 4
DefiniciónDefinición•• Pila:Pila: Grupo Ordenado, (de
acuerdo 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)
Pila
Cabeza
Añadir Eliminar
Metodología de la Programación. Curso 2002/03. Pág. 5
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 la Programación. Curso 2002/03. Pág. 6
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
Metodología de la Programación. Curso 2002/03. Pág. 7
ImplementaciónImplementación1) Con un Array• Array estructura adecuada Elementos Homogéneos• Elementos almacenados de forma Secuencial
CONSTANTES
MAXPILA ← 100
TIPOS
TElemento = ENTERO
TPila = ARRAY[1..MAXPILA]DE TElemento
Metodología de la Programación. Curso 2002/03. Pág. 8
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
Metodología de la Programación. Curso 2002/03. Pág. 9
CONSTANTES
CABEZA ← 0
MAXPILA ← 100
TIPOS
TPila = ARRAY[CABEZA..MAXPILA] DE TElemento
[0] [1] [2] [3][0] [1] [2] [3] [99] [100][99] [100]
CabezaCabeza
33 55 33 22 ..............
BasuraBasura
223355
CabezaCabeza
Metodología de la Programación. Curso 2002/03. Pág. 10
• Inconveniente: Solo es posible implementar una pila deenteros (no de cualquier otro tipo de datos)
• Solución: CONSTANTESMAXPILA ← 100
TIPOSTElemento= // cualquier tipo de datosTPila=REGISTRO
Cabeza: NATURALElementos: ARRAY[1..MAXPILA] DE TElemento
1 1 2 2 k k MAXPILAMAXPILA55 1313 88kk
CabezaCabeza ElementosElementos
Metodología de la Programación. Curso 2002/03. Pág. 11
IMPLEMENTACIÓN
FUNC CrearPila():TPila
VARIABLES
pila:TPila
INICIO
pila.Cabeza ← 0
RESULTADO ← pila
FIN
FUNC PilaVacia(↓pila:TPila):LÓGICO
INICIO
RESULTADO←pila.Cabeza=0
FIN
FUNC PilaLlena(↓pila:TPila
):LÓGICO
INICIO
RESULTADO ←(pila.Cabeza= MAXPILA)
FIN
PROC DestruirPila(↓↑pila:TPila)INICIO
// No hay que hacer nada.
FIN
Metodología de la Programación. Curso 2002/03. Pág. 12
PROC SacarPila(↓↑pila:TPila;
↑elem:TElemento)INICIO
elem ← pila.Elementos[pila.Cabeza]
pila.Cabeza←pila.Cabeza-1
FIN
/* precondición:
la pila no ha de estar vacía
*/
PROC MeterPila(↓↑pila:TPila;
↓elem :TElemento)
INICIO
pila.Cabeza←pila.Cabeza+1
pila.Elementos
[pila.Cabeza] ← elem
FIN
/* precondición:la pila no ha de estar llena
*/
Metodología de la Programación. Curso 2002/03. Pág. 13
PROC MeterPila (↓↑pila:TPila;↓elem:TElemento;↑llena : LÓGICO)
Inicio
llena ←PilaLlena(pila)
SI (¬llena) ENTONCES
pila.Cabeza← pila.Cabeza + 1
pila.Elementos
[pila.Cabeza] ← elem
FINSI
Fin
/* Sin Precondición.Introduceun elemento en la pila sino está llena */
PROC SacarPila(↓↑pila:TPila ;↑elem:TElemento;↑vacia:LÓGICO)
INICIO
vacia ← PilaVacia(pila)
SI ¬¬¬¬vacia ENTONCES
elem←pila.Elementos[pila.Cabeza]
pila.Cabeza ←pila.Cabeza-1
FINSI
FIN
/* Sin precondición. Saca unelemento de la pila si no estávacía*/
Metodología de la Programación. Curso 2002/03. Pág. 14
2) Con una Lista Enlazada de Punteros• Comienzo de una lista enlazada Cabeza de la PilaTIPOS
TElemento= // cualquier tipo de datosTPila = PUNTERO A TNodoPilaTNodoPila = REGISTRO
dato:TElementosig: TPila
FINREGISTRO
1010 88
cabezacabeza
101088
Metodología de la Programación. Curso 2002/03. Pág. 15
PROC MeterPila(↓↑pila:TPila;↑elem: TElemento;↑llena: LÓGICO)
VARIABLES
nuevonodo : TPila
INICIO
llena ← FALSO
nuevonodo ←NUEVO(TNodoPila)
nuevonodo^.dato ← elem
nuevonodo^.sig ← pila
pila ← nuevonodo
FIN
PROC SacarPila(↓↑pila:TPila;↑elem:TElemento;↑vacía: LÓGICO)
VARIABLESptr: TPila
INICIOvacía ← PilaVacía(pila)SI ¬vacía ENTONCES
elem ← pila^.dato
ptr ← pila
pila ← pila^.sigELIMINAR(ptr)
FINSIFIN
Metodología de la Programación. Curso 2002/03. Pág. 16
PROC CrearPila():TPila
INICIO
RESULTADO ← NULO
Fin
FUNC PilaVacia(pila :TPila
):LÓGICO
INICIO
RESULTADO ← (pila= NULO)
FIN
PROC DestruirPila(↓↑pila:TPila)
Variables
ptr: TPila
Inicio
MIENTRAS(pila≠ NULO)HACER
ptr ← pila
pila ← pila^.sig
ELIMINAR(ptr)
FINMIENTRAS
FIN
Metodología de la Programación. Curso 2002/03. Pág. 17
AplicacionesAplicaciones•• Ejemplo1Ejemplo1: Leer una secuencia de caracteres desde teclado: Leer una secuencia de caracteres desde teclado
e 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 su
inversa}inversa} (Suponemos que $ no está ni en W ni en W´)(Suponemos que $ no está ni en W ni en W´)
Metodología de la Programación. Curso 2002/03. Pág. 18
ALGORITMO InversoDESDE MPila IMPORTA
TPila, CrearPila,MeterPila, SacarPila,Pilavacia, DestruirPila
CONSTANTESENTER ← CHR(13)
TIPOSTElemento = CARÁCTER
VARIABLESc : TElementopila : TPilall,v:LÓGICO
INICIO
pila ← CrearPila()LEER(c)
MIENTRAS (c≠ENTER) ∧(¬ll) HACER
MeterPila(pila,c,ll)Leer(c)
FINMIENTRASSacarPila(pila,c,v)MIENTRAS(¬PilaVacia(pila))HACER
SacarPila(pila,c,v)Escribir(c)
FINMIENTRASDestruirPila(pila)
FIN
Metodología de la Programación. Curso 2002/03. Pág. 19
ALGORITMO Balanceo
DESDE MPila IMPORTA CrearPila, TPila,MeterPila, SacarPila, PilaVacia,DestruirPila
CONSTANTESENTER ← CHR(13)
Tipos
TElemento = CARÁCTER
VARIABLES
c : TElemento
pila : TPila
bien,ll, v : LÓGICO
Inicio
pila ← CrearPila()
bien ← CIERTO
LEER(c)
MIENTRAS(bien ∧∧∧∧ (c≠ENTER)HACERSI c= ‘(’ ENTONCES
MeterPila(pila,c,ll)
bien ← ¬llEN OTRO CASO
SI c = ‘)’ ENTONCES
SacarPila(pila,c,v)
bien ← ¬vFINSI
FINSI
LEER(c)
FINMIENTRAS
SI bien ∧ PilaVacia(pila) ENTONCES
Escribir(“cadena balanceada “)
EN OTRO CASO
Escribir(“cadena no balanceada”)
FINSI
DestruirPila(pila)
FIN
Metodología de la Programación. Curso 2002/03. Pág. 20
Algoritmo Lenguaje_LDESDE MPila IMPORTA TPila,
CrearPila, MeterPila,SacarPila, DestruirPila
CONSTANTESENTER ← CHR(13)
TIPOSTElemento = CARÁCTER
VARIABLESc1, c2 : TElementopila : TPilabien, ll, v : LÓGICO
Iniciopila ← CrearPila()ll ← FALSOLEER(c1)MIENTRAS (c1=≠‘$’)∧(¬ll) HACER
MeterPila(pila,c1,ll)LEER(c1)
FINMIENTRAS
Leer(c1)
bien ← TRUEMIENTRAS (bien ∧ (c1 ≠ENTER))
HACERSacarPila(pila,c2,v)bien ← (¬v) ∧ (c1=c2)/* He podido sacar el
elemnto y conicide*/SI (bien) ENTONCESLeer(c1)
FINSIFINMIENTRASSI (bien ∧
PilaVacia(pila))ENTONCESEscribir(“ Si pertenece”)
EN OTRO CASOEscribir (“No pertenece”)
FINSIDestruirPila(pila)
FIN
Metodología de la Programación. Curso 2002/03. Pág. 21
• 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 uso
de paréntesis para evitar ambigüedades A+B*C
Metodología de la Programación. Curso 2002/03. Pág. 22
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 PostfijaNotación Postfija• 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*
Metodología de la Programación. Curso 2002/03. Pág. 23
• 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ónPostfija1)Usaremos una pila2)La expresión postfija se almacenará en un array de caracteresy será correcta3)Los operadores serán: +, -, * y /4)Los operandos serán letras mayúsculas (a cada una lepodemos asignar un valor)
Metodología de la Programación. Curso 2002/03. Pág. 24
CONSTANTES
MAX ← 20
TIPOS
TArray = ARRAY[1..MAX] DECARÁCTER
TElemento=ENTERO
FUNC Operando(↓c:CARACTER):ENTERO
VARIABLES
res:ENTERO
INICIO
CASO c SEA
‘A’ : res ← 5
‘B’ : res ← 7
‘C’ : res ← -1
‘D’ : res ← 11
EN OTRO CASO
res ← 0
FINCASO
RESULTADO ← res
FIN
Metodología de la Programación. Curso 2002/03. Pág. 25
FUNC Eval_postfija(↓exp: TArray; ↓ultimo:NATURAL):ENTERO
DESDE MPila IMPORTA TPila, CrearPila, MeterPila, SacarPila,DestruirPila
Variablespila : TPilai, op1, op2, result : ENTEROc : CARÁCTERv,ll:LÓGICO
FUNC es_operador(↓c:CARÁCTER):LÓGICOINICIO
RESULTADO ← (c=`*´) ∨ (c=`/´) ∨ (c=`+´) ∨ (c=`-´}FIN
Metodología de la Programación. Curso 2002/03. Pág. 26
Iniciopila ← CrearPila()PARA i ← 1 HASTA ultimo HACER
c ← exp[i]SI es_operador(c) ENTONCES
SacarPila(pila,op2,v)SacarPila(pila,op1,v)CASO c SEA
‘+’ :MeterPila(pila,op1+op2,ll)‘-’ : MeterPila(pila,op1-op2,ll)‘*’ : MeterPila(pila,op1*op2,ll)‘/’ : MeterPila(pila, op1/op2,ll)
FINCASOEN OTRO CASO
MeterPila(pila, Operando(c))FINSI
FINPARASacarPila(pila,result)DestruirPila(pila)RESULTADO ←←←← result
Fin
Metodología de la Programación. Curso 2002/03. Pág. 27
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)
FrenteFrente FinalFinal MeterMeterSacarSacar
Metodología de la Programación. Curso 2002/03. Pág. 28
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*/
Metodología de la Programación. Curso 2002/03. Pág. 29
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 la Programación. Curso 2002/03. Pág. 30
ImplementaciónImplementación1) 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)
Metodología de la Programación. Curso 2002/03. Pág. 31
• Ejemplo:
1 2 3 4 ..........1 2 3 4 ..........
1 2 3 4 ..........1 2 3 4 ..........
Final=1Final=1
1 2 3 4 ..........1 2 3 4 ..........
Meter(Cola,”A”)Meter(Cola,”A”) AA
1 2 3 4 ..........1 2 3 4 ..........
AA BBMeter(cola, “B”)Meter(cola, “B”) Final=2Final=2
Sacar(cola, Sacar(cola, elemelem)) BB
1 2 3 4 ..........1 2 3 4 ..........
BB Final=1Final=1DesplazarDesplazar
Metodología de la Programación. Curso 2002/03. Pág. 32
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
Metodología de la Programación. Curso 2002/03. Pág. 33
• Ejemplo:
1 2 3 4 ..........1 2 3 4 ..........
1 2 3 4 ..........1 2 3 4 ..........
Meter(Cola,”A”)Meter(Cola,”A”) AA
AA BBMeter(cola, “B”)Meter(cola, “B”)
Frente=1Frente=1
Final=1Final=1
Frente=1Frente=1
Final=2Final=2
1 2 3 4 ..........1 2 3 4 ..........
AA BBMeter(cola, “C”)Meter(cola, “C”) CCFrente=1Frente=1
Final=3Final=3
1 2 3 4 ..........1 2 3 4 ..........
BBSacar(cola,Sacar(cola,elemelem)) CCFrente=2Frente=2
Final=3Final=3
Metodología de la Programación. Curso 2002/03. Pág. 34
• 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
Metodología de la Programación. Curso 2002/03. Pág. 35
•• Ejemplo:Ejemplo:11 22
33
4455
66
BB
HH
11 22
33
4455
66
BB
HH
11 22
33
4455
66 HHFrente=6Frente=6
Final=6Final=6Frente=5Frente=5
Final=6Final=6
11 22
33
4455
66
BB
HHMeter(cola,”G”)Meter(cola,”G”)GG Frente=5Frente=5
Final=1Final=1Frente=5Frente=5
Final=6Final=6
Sacar(cola,Sacar(cola,elemelem))
Metodología de la Programación. Curso 2002/03. Pág. 36
11 22
33
4455
66
BB
HHMeter(cola,”L”)Meter(cola,”L”)MM Frente=4Frente=4
Final=3Final=3
¿Como sabemos si la cola está vacía o llena?11 22
33
4455
66
BB
HHFrente=4Frente=4
Final=2Final=2
MM AA
SS
LLAA
SS!!Cola llena!!!!Cola llena!!
11 22
33
4455
66 BB
11 22
33
4455
66Frente=4Frente=4
Final=3Final=3Frente=3Frente=3
Final=3Final=3Sacar(cola,Sacar(cola,elemelem))
!!Cola Vacía!!!!Cola Vacía!!
Metodología de la Programación. Curso 2002/03. Pág. 37
• Solución:• 1) Disponer de otra variable Contabilizará los
elementos almacenados en la colaVariable=0 Cola vacíaVariable=MaxCola Cola llena
Inconveniente: añade más procesamiento a las operacionesMeter y Sacar
• 2) Frente apunte a la casilla del array que precede a la delelemento frente de la cola Solución elegida
Metodología de la Programación. Curso 2002/03. Pág. 38
• Ejemplo:11 22
33
4455
66
BB
HHFrente=4Frente=4
Final=6Final=6
11 22
33
4455
66
BB
HHMeter(cola,”G”)Meter(cola,”G”)GG Frente=4Frente=4
Final=1Final=1
¿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 =frente11 22
33
4455
66
BB
HHFrente=3Frente=3
Final=2Final=2
MM AA
SS
resres
Metodología de la Programación. Curso 2002/03. Pág. 39
¿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)
11 22
33
4455
66
BB
11 22
33
4455
66Frente=5Frente=5
Final=5Final=5Frente=4Frente=4
Final=5Final=5Sacar(cola,Sacar(cola,elemelem))
resres
Metodología de la Programación. Curso 2002/03. Pág. 40
• Agrupamos en un registro los índices frente y final, juntocon el array que contendrá los elementos de la cola
CONSTANTESMAXCOLA ← 100
TIPOSTElemento = // Cualquier tipo de datosTCola = REGISTRO
elementos:ARRAY[1..MAXCOLA]DE TElementoFrente,Final : [1.. MAXCOLA]
FINREGISTRO
1 1 2 2 MaxColaMaxCola55 1313
frentefrente
finalfinal
22
MaxcolaMaxcola
Metodología de la Programación. Curso 2002/03. Pág. 41
FUNC CrearCola():TCola
VARIABLES
cola: TCola
INICIO
cola.Frente ← MAXCOLA
cola.Final ← MAXCOLA
RESULTADO ← cola
FIN
PROC DestruirCola(↓↑cola:TCola)
INICIO
// No hay que hacer nada.
FIN
FUNC ColaLlena(↓cola:Tcola):LÓGICO
INICIO
RESULTADO ←(cola.Final MOD MAXCOLA)+1
= cola.Frente
FIN
FUNC ColaVacia(↓cola:Tcola):LÓGICO
INICIO
RESULTADO←←←← cola.Final =cola.Frente
FIN
Metodología de la Programación. Curso 2002/03. Pág. 42
PROC MeterCola(↓↑cola:TCola;↓elem:TElemento)
VARIABLES
fin:NATURAL
INICIO
fin ← (cola.Final MOD
MAXCOLA) + 1
cola.Final ← fin
cola.elementos[fin]←elem
FIN
PROC SacarCola(↓↑cola:TCola;↑elem:TElemento)
VARIABLES
ini:NATURAL
INICIO
ini ← (cola.Frente MODMAXCOLA) + 1
cola.Frente ← inielem←cola.elementos[ini]
FIN
Metodología de la Programación. Curso 2002/03. Pág. 43
2) Con listas enlazadas con Punteros• Usamos dos variables de tipo puntero, frente y final, que
apunten a los nodos que contienen los elementos frente yfinal
• ¿Que sucedería si intercambiáramos las posiciones defrente y final en la lista enlazada?
1010 88 44
FrenteFrente FinalFinal
Metodología de la Programación. Curso 2002/03. Pág. 44
• Agrupamos las variables frente y final en un registroTIPOS
TElemento = // cualquier tipo de datosTPuntero = PUNTERO A TNodoTNodo = REGISTRO
valor : TElementosig : TPuntero
FINREGISTROTCola = REGISTRO
Frente : TPunteroFinal : TPuntero
FINREGISTRO
1010 8833
FrenteFrente FinalFinal
Metodología de la Programación. Curso 2002/03. Pág. 45
FUNC CrearCola(): TCola
VARIABLES
cola:TCola
INICIO
cola.Frente ← NULO
cola.Final ← NULO
RESULTADO ← cola
FIN
FUNC ColaVacia(↓cola:TCola):LÓGICO
INICIO
RESULTADO ←cola.Frente = NULO
FIN
PROC DestruirCola(↓↑cola:TCola)
Variables
nodo,sgte: TPuntero
Inicio
SI(cola.Frente≠NULO) ENTONCES
sgte ← cola.Frente
MIENTRAS (sgte≠NULO) HACER
nodo ← sgte
sgte ← sgte^.sigELIMINAR(nodo)
FINMIENTRAS
FINSI
cola.Frente ← NULO
cola.Final ← NULOFIN
Metodología de la Programación. Curso 2002/03. Pág. 46
PROC MeterCola(↓↑cola:TCola;↓elem:TElemento)
VARIABLESptr: TPuntero
Inicioptr ← NUEVO(TNodo)ptr^.valor ← elemptr^sig ← NULOSI ColaVacia(cola)
ENTONCEScola.Frente ← ptr
EN OTRO CASOcola.Final^.sig ← ptr
FINSIcola.Final ← nuevonodo
FIN
PROC SacarCola (↓↑cola:TCola;↑elem:TElemento)
VARIABLES
temp : TipoPuntero
INICIO
temp ← cola.Frente
elem ← cola.Frente^.valor
cola.Frente ←cola.Frente^.sig
SI (cola.Frente=NULO)
ENTONCES
cola.Final ← NULOFINSI
ELIMINAR(temp)
FIN
Metodología de la Programación. Curso 2002/03. Pág. 47
Ejemplo: Reconocimiento del lenguaje. L={W$W/W es una cadena que no contiene a$}Algoritmo Lenguaje_LDESDE MCola IMPORTA TCola, CrearCola, ColaVacia, SacarCola,
MeterCola, DestruirColaCONSTANTES
ENTER ← CHR(13)TIPOS
TElemento = CARÁCTERVARIABLES
bien : LÓGICOc1,c2 : TElementocola : TCola
INICIOcola ← CrearCola()LEER(c1)MIENTRAS (c1 ≠ ‘$’) HACER
MeterCola(cola,c1)LEER(c1)
FINMIENTRAS
Metodología de la Programación. Curso 2002/03. Pág. 48
Leer(c1)bien ← CIERTOMIENTRAS (bien ∧ (c1≠ENTER) HACER
SI ColaVacia(cola) ENTONCESbien ← FALSE
EN OTRO CASOSacarCola(cola,c2)SI (c1 ≠c2) ENTONCES
bien ← FALSEEN OTRO CASO
LEER(c1)FINSI
FINSIFINMIENTRASSI (bien ∧ ColaVacia(cola)) ENTONCES
Escribir(“Pertenece”)EN OTRO CASO
Escribir(“No pertenece”)FINSIDestruirCola(cola)
FIN
Metodología de la Programación. Curso 2002/03. Pág. 49
• Definición de lista
• Implementación - Estática
- Dinámica
Metodología de la Programación. Curso 2002/03. Pág. 50
• 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.
Metodología de la Programación. Curso 2002/03. Pág. 51
Operaciones sobre listas:Crear
¿Esta vacía?
¿Está llena?
Insertar un elemento
Eliminar un elemento
Imprimir
Destruir
- De forma ordenada
- De forma no ordenada
Metodología de la Programación. Curso 2002/03. Pág. 52
MÓDULO Mlistas
DEFINICIÓN
TIPOS
TElemento =// cualquier tipo de datos
TLista = // por definirFUNC CrearLista():TLista
FUNC ListaVacia(↓lista:TLista): LÓGICO
FUNC ListaLlena(↓lista:TLista): LÓGICO
PROC InsertarLista(↓↑lista:TLista; ↓elem:TElemento)PROC EliminarLista(↓↑Lista:TLista; ↓elem:TElemento)PROC ImprimirLista(lista:TLista)
PROC DestruirLista(↓↑lista: TLista)
IMPLEMENTACIÓN
..............
Fin
Metodología de la Programación. Curso 2002/03. Pág. 53
• Implementación:
– Representación secuencial
– Representación enlazada - Dinámica
- Estática
Metodología de la Programación. Curso 2002/03. Pág. 54
Dinámicas
• Utilizaremos punteros para crear la lista enlazada deelementos.
• Las definiciones de tipos y la implementación de lasoperaciones se han visto.
Metodología de la Programación. Curso 2002/03. Pág. 55
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 la Programación. Curso 2002/03. Pág. 56
Metodología de la Programación. Curso 2002/03. Pág. 57
• 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 la Programación. Curso 2002/03. Pág. 58
Metodología de la Programación. Curso 2002/03. Pág. 59
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 mediante
asignación dinámica de memoria, consideramos el array yla variable LibreLibre como globales al módulo deimplementación de la lista.
MÓDULO Mlistas
DEFINICIÓN
CONSTANTES
VALOR_NULO ← 0 // Hace las funciones de NULO
MAX ← 100
TIPOS
TLista = [0..Max]
TElemento = // cualquier tipo de datos
TNodo = REGISTRO
elemento : TElemento
sig : TLista
FINREGISTRO
FUNC CrearLista():TLista
FUNC ListaVacia(↓lista:TLista): LÓGICO
PROC ListaLlena(↓lista: TLista): LÓGICO
PROC ImprimirLista(↓lista: TLista)
PROC InsertarLista(↓↑lista:TLista; ↓elem:TElemento)PROC EliminarLista(↓↑lista:TLista; ↓elem:TElemento)PROC DestruirLista(↓↑lista:TLista)
Metodología de la Programación. Curso 2002/03. Pág. 60
IMPLEMENTACIÓN
TIPOS
TMemoria = ARRAY [1..MAX] DE TNodo
VARIABLES
memoria : TMemoria
libre : TLista
FUNC CrearLista():TLista
INICIO
RESULTADO ←←←← VALOR_NULOFIN
FUNC ListaVacia(↓lista:TLista): LÓGICO
INICIO
RESULTADO ←←←← (lista = VALOR_NULO)FIN
FUNC ListaLlena(↓lista:TLista):LÓGICOINICIO
RESULTADO ←←←← (libre = VALOR_NULO)FIN
Metodología de la Programación. Curso 2002/03. Pág. 61
FUNC NuevoNodo(): Tlista
VARIABLES
ptr: TLista
INICIO
ptr ← libre
SI (ptr ≠ Nulo) ENTONCES
libre ← memoria[ptr]. sigFINSI
RESULTADO ← ptrFIN
PROC EliminarNodo (↓↑p : TLista)INICIO
memoria[p].sig ← libre
lbre ← p
p ← VALOR_NULOFIN
Para los procedimientos InsertarListaInsertarLista y EliminarLista, necesitamosantes implementar las operaciones (NuevoNodo, EliminarNodo)equivalentes a las que usamos al trabajar con memoriadinámica.
Metodología de la Programación. Curso 2002/03. Pág. 62
PROC ImprimirLista(↓lista : TLista)
VARIABLES
ptr : TLista
INICIO
ptr ← lista
MIENTRAS (ptr ≠ VALOR_NULO) HACER
Escribir(memoria[ptr].elemento)
ptr ← memoria[ptr].sig
FINMIENTRAS
FIN
PROC InsertarLista(↓↑lista: TLista; ↓elem: TElemento)
VARIABLES
ptr : TLista
INICIO
ptr ← NuevoNodo()
SI (ptr ≠ VALOR_NULO) ENTONCES
memoria[ptr].elemento ← elem
memoria[ptr].sig ← lista
lista ← ptr
FINSI
FIN
Depende de TElemento
Metodología de la Programación. Curso 2002/03. Pág. 63
PROC EliminarLista (↓↑lista: TLista; ↓elem :TElemento)
VARIABLES
pav, pret : TLista
INICIO
pav ← lista // puntero avanzado
pret ← Nulo // puntero retrasado
MIENTRAS (memoria[pav].elemento ≠ elem) HACER
pret ← pav
pav ← memoria[pav].sig
FINMIENTRAS
SI (pret = VALOR_NULO) ENTONCES
lista ← memoria[lista].sig
EN OTRO CASO
memoria[pret].sig ← memoria[pav].sig
FINSI
EliminarNodo(pav)
Fin
Suponemos que elelemento a borrar
está en la lista
Metodología de la Programación. Curso 2002/03. Pág. 64
PROC DestruirLista(↓↑lista: TLista)
Variables
aux: TLista
INICIO
MIENTRAS (lista ≠ VALOR_NULO) HACER
aux ← lista
lista ← memoria[lista].sig
EliminarNodo(aux)
FIN
FIN
INICIO // Mlista
Libre ← 1
PARA ptr ← 1 HASTA (Max-1) HACER
memoria[ptr].sig ← ptr + 1
FINPARA
memoria[Max].enlace ← VALOR_NULO
FIN // Mlista
Metodología de la Programación. Curso 2002/03. Pág. 65
Metodología de la Programación. Curso 2002/03. Pág. 66
• 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.
Metodología de la Programación. Curso 2002/03. Pág. 67
• 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 la Programación. Curso 2002/03. Pág. 68
Ejemplo: (usando una implementación estática)Ejemplo: (usando una implementación estática)PROC ImprimirLista(↓lista:TLista)VARIABLESptr : TLista
INICIOptr ← listaSI (ptr ≠ VALOR_NULO) ENTONCES
REPETIREscribir(memoria[ptr].elemento)ptr ← memoria[ptr].sig
HASTA QUE ptr = listaFINSI
Fin
Metodología de la Programación. Curso 2002/03. Pág. 69
• 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 la Programación. Curso 2002/03. Pág. 70
• 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
Metodología de la Programación. Curso 2002/03. Pág. 71
• Una lista doblemente enlazada puede modificarse paraobtener una estructura circular de la misma
ImplementaciónImplementación
lista
Metodología de la Programación. Curso 2002/03. Pág. 72
NIVEL DE UTILIZACIÓN
• Estructura muy utilizada.
•• Ejemplo:Ejemplo:
Manejo de tablas hash con el método de encadenamiento parael tratamiento de sinónimos.– Utilizaríamos un array de listas como tabla hash. (Lo que en el
primer tema se llamó Encadenamiento)
– Las listas tienen como elementos cadenas de caracteres.
Modulo Mhash
DEFINICIÓN
DESDE MLista IMPORTA Tlista
CONSTANTES
MAXCAD ← 20
MAXELE ← 100
TIPOS
TCadena = ARRAY [0..MAXCAD-1] DE CARÁCTER
TElemento = TCadena
TRango = [0.. MAXELE-1]
TTablaHash= ARRAY TRango DE TLista
PROC Almacenamiento(↓↑tabla:TTablaHash; ↓dato:TElemento)
FUNC Búsqueda(↓tabla:TTablaHash; ↓dato:TElemento):LÓGICO
PROC Eliminación(↓↑tabla:TTablaHash; ↓dato:TElemento)
Metodología de la Programación. Curso 2002/03. Pág. 73
IMPLEMENTACIÓN
PROC Almacenamiento(↓↑tabla:TTablaHash; ↓dato:TElemento)
INICIO
Insertar(tabla[Hash(dato)],dato)
FIN
FUNC Búsqueda(↓tabla:TTablaHash; ↓dato:TElemento):LÓGICOINICIO
RESULTADO ← Buscar(tabla[Hash(dato)],dato)
FIN
PROC Eliminación(↓↑tabla:TTablaHash; ↓dato:TElemento)INICIO
Eliminar(tabla[Hash(dato)],dato)
FIN
Fin /* Mhash */
Metodología de la Programación. Curso 2002/03. Pág. 74
Metodología de la Programación. Curso 2002/03. Pág. 75
• 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 llamado
la 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 la Programación. Curso 2002/03. Pág. 76
• 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.
Metodología de la Programación. Curso 2002/03. Pág. 77
• 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 la Programación. Curso 2002/03. Pág. 78
•• Árbol Árbol estrictamenteestrictamente binario binario: árbol binario en que cada nodono-hoja tiene subárboles izquierdo y derecho no vacíos.
•• NivelNivel de un nodo en un árbol binario de un nodo en un árbol binario: 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 binario de un árbol binario: máximo nivel de cualquierhoja del árbol.
•• Árbol binario Árbol binario 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.
Metodología de la Programación. Curso 2002/03. Pág. 79
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 la Programación. Curso 2002/03. Pág. 80
Árbol ternario: 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-ario: 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.
Metodología de la Programación. Curso 2002/03. Pág. 81
¿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 MArbolBin
DEFINICIÓN
TIPOS
TElemento = // Cualquier tipo de datos
TArbolBin = PUNTERO A TNodoArbolBin
TNodoArbolBin = REGISTRO
dato : TElemento
izq,der : TArbolBin
FINREGISTRO
FUNC CrearArbolVacio():TArbolBin
FUNC CrearArbol(↓raiz:TElemento;↓izq, ↓dch: TArbolBin): TArbolBin
FUNC ArbolVacio(↓arbol:TArbolBin):LÓGICOFUNC Info(↓arbol:TArbolBin):TElementoFUNC Izq(↓arbol:TArbolBin): TArbolBin
FUNC Der(↓arbol: TArbolBin): TArbolBin
PROC DestruirArbol(↓↑arbol: TArbolBin)
Implementación dinámica
Metodología de la Programación. Curso 2002/03. Pág. 82
IMPLEMENTACIÓN
FUNC CrearArbolVacio():TArbolBin
INICIO
RESULTADO ← NULO
FIN
FUNC CrearArbol(↓raiz:TElemento;↓izq, ↓dch: TArbolBin
): TArbolBin
VARIABLES
arbol : TArbolBin
INICIO
arbol ← NUEVO(TNodoArbolBin)
arbol^.dato ← raiz
arbol^.izq ← izq
arbol^.der ← dch
RESULTADO ← arbol
FIN
Metodología de la Programación. Curso 2002/03. Pág. 83
FUNC ArbolVacio(↓arbol:TArbolBin):LÓGICOINICIO
RESULTADO ← (arbol = NULO)
FIN
FUNC Info(↓arbol:TArbolBin):TElementoINICIO
RESULTADO ← arbol^.dato
FIN
FUNC Izq(↓arbol:TArbolBin): TArbolBin
INICIO
RESULTADO ← arbol^.izq
FIN
FUNC Der(↓arbol: TArbolBin): TArbolBin
INICIO
RESULTADO ← arbol^.der
FIN
Metodología de la Programación. Curso 2002/03. Pág. 84
PROC DestruirArbol(↓↑arbol: TArbolBin)
INICIO
SI (¬ArbolVacio(arbol)) ENTONCES
DestruirArbol(arbol^.der)
DestruirArbol(arbol^.izq)
ELIMINAR(arbol)
FINSI
FIN
FIN // MArbolBin
Metodología de la Programación. Curso 2002/03. Pág. 85
Módulo MArbolBinEstático
DEFINICIÖNCONSTANTES
VALOR_NULO ← 0
MAX ← 100
TIPOS
TArbolBin = [0..MAX]
TNodoArbolBin = REGISTRO
dato : TElemento
izq,der : TArbolBin
FINREGISTRO
FUNC CrearArbolVacio():TArbolBin
FUNC CrearArbol(↓raiz:TElemento;↓izq, ↓dch: TArbolBin): TArbolBin
FUNC ArbolVacio(↓arbol:TArbolBin):LÓGICOFUNC Info(↓arbol:TArbolBin):TElementoFUNC Izq(↓arbol:TArbolBin): TArbolBin
FUNC Der(↓arbol: TArbolBin): TArbolBin
PROC DestruirArbol(↓↑arbol: TArbolBin)
Implementación estática
Se deja propuesto como ejercicio la Se deja propuesto como ejercicio la parte de implementación de los parte de implementación de los procedimientos y funciones de una procedimientos y funciones de una implementación estática de un implementación estática de un árbol binarioárbol binario
Metodología de la Programación. Curso 2002/03. Pág. 86
Metodología de la Programación. Curso 2002/03. Pág. 87
NIVEL DE UTILIZACIÓN• Estructura de datos muy útil cuando se deben tomar decisiones de "dos
caminos”• Muy utilizado en aplicaciones relacionadas con expresiones
aritméticas.
Ejemplos:Ejemplos:
+
5 2
(12-3)*(4+1)
5 + 2
*
- +
12 3 4 1
Metodología de la Programación. Curso 2002/03. Pág. 88
Ejemplo:Ejemplo:
Tipos
TipoDecision = (Operador, Operando)
TElemento = REGISTRO
CASO contenido:TipoDecision SEA
Operador:
oper: CARÁCTER
Operando:
val: REAL
FINCASO
FINREGISTRO
Diseñemos un algoritmo para evaluar una expresiónaritmética que está almacenada en un árbol binario.
FUNC Eval(↓arbol:TArbolBin):REALVARIABLES
dato:TElemento;
result: REAL
INICIO
dato ← Info(arbol)
SI (dato.contenido = Operando) ENTONCES
result ← dato.val
EN OTRO CASO
CASO dato.oper SEA
'+': result ← Eval(Izq(arbol))+Eval(Der(arbol))
'-': result ← Eval(Izq(arbol))-Eval(Der(arbol))
'*': result ← Eval(Izq(arbol))*Eval(Der(arbol))
'/': result ← Eval(Izq(arbol))/Eval(Der(arbol))
FINCASO
FINSI
RESULTADO ← result
Fin
Metodología de la Programación. Curso 2002/03. Pág. 89
Metodología de la Programación. Curso 2002/03. Pág. 90
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
Metodología de la Programación. Curso 2002/03. Pág. 91
• 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 la Programación. Curso 2002/03. Pág. 92
Operaciones:
CrearBuscarInsertarSuprimirImprimir
Las definidas para unárbol binario general
Módulo MABBDefinición
TIPOS
TRecorrido = (InOrden,PreOrden,PostOrden)
TClave = ENTERO
TElemento = REGISTRO
clave:TClave.........
FINREGISTRO
TABB = PUNTERO A TNodoABB
TNodoABB = REGISTRO
izq,der:TABB
elem:TElemento
FINREGISTRO
// Operaciones típicas de los árboles
FUNC CrearABB():TABB
FUNC ABBVacio(↓arbol:TABB):LÓGICOFUNC InfoABB(↓arbol:TABB):TElementoFUNC IzqABB(↓arbol:TABB): TABB
FUNC DerABB(↓arbol: TABB): TABB
PROC DestruirABB(↓↑arbol: TABB)
Metodología de la Programación. Curso 2002/03. Pág. 93
// Operaciones Exclusivas de los árboles binarios de búsqueda
PROC BuscarABB(↓arbol:TABB; ↓c:TClave; ↑dato:TElemento;↑EnArbol:LÓGICO)
PROC InsertarABB(↓↑arbol:TABB; ↓dato:TElemento)
PROC SuprimirABB(↓↑arbol:TABB; ↓c:TClave)PROC ImprimirABB(↓arbol:TABB; ↓rec:TRecorrido)
IMPLEMENTACIÓN
FUNC CrearABB():TABB
INICIO
RESULTADO ← NULO
FIN
FUNC ABBVacio(↓arbol:TABB):LÓGICOINICIO
RESULTADO ← (arbol = NULO)
FIN
FUNC InfoABB(↓arbol:TABB):TElementoINICIO
RESULTADO ← arbol^.dato
FIN
Metodología de la Programación. Curso 2002/03. Pág. 94
FUNC IzqABB(↓arbol:TABB): TABB
INICIO
RESULTADO ← arbol^.izq
FIN
FUNC DerABB(↓arbol: TABB): TABB
INICIO
RESULTADO ← arbol^.der
FIN
PROC DestruirABB(↓↑arbol: TABB)
INICIO
DestruirABB(arbol^.izq)
DestruirABB(arbol^.dch)ELIMINAR(arbol)
FIN
Metodología de la Programación. Curso 2002/03. Pág. 95
PROC BuscarABB(↓arbol:TABB; ↓c:TClave; ↑dato:TElemento;↑EnArbol:LÓGICO)
// Solución Iterativa
VARIABLES
ptrArbol: TABB
ele:TElemento
INICIO
EnArbol ← FALSO
ptrArbol ← arbol
MIENTRAS ((¬ABBVacio(ptrArbol)) ∧ (¬EnArbol)) HACER
ele = InfoABB(ptrArbol)
SI (ele.clave = c) ENTONCES
EnArbol ← CIERTO
dato ← ele
SINO SI (c < ele.clave) ENTONCES
ptrArbol ← IzqABB(ptrArbol)
EN OTRO CASO
ptrArbol ← DechABB(ptrArbol)
FINSI
FINMIENTRAS
FIN
Metodología de la Programación. Curso 2002/03. Pág. 96
PROC BuscarABB(↓arbol:TABB; ↓c:TClave; ↑dato:TElemento;↑EnArbol:LÓGICO)
// Solución Recursiva
VARIABLES
ele:TElemento
INICIO
SI (ABBVacio(arbol)) ENTONCES
EnArbol ← FALSO
EN OTRO CASO
ele = InfoABB(arbol)
SI (ele.clave = c) ENTONCES
EnArbol ← CIERTO
dato ← ele
SINO SI (c < ele.clave ) ENTONCES
BuscarABB(IzqABB(arbol),c,dato,EnArbol)
EN OTRO CASO
BuscarABB(DechABB(arbol),c,dato,EnArbol)
FINSI
FINSI
FIN
Metodología de la Programación. Curso 2002/03. Pág. 97
Metodología de la Programación. Curso 2002/03. Pág. 98
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
Metodología de la Programación. Curso 2002/03. Pág. 99
PROC InsertarABB(↓↑arbol:TABB; ↓dato:TElemento)// Solución Iterativa
VARIABLES
nuevonodo,pav,pret:TABB
clavenueva:Tclave
ele:TElemento
Inicio
nuevonodo ← NUEVO(TNodoABB)
nuevonodo^.izq ← NULO
nuevonodo^.der ← NULO
nuevonodo^.elem ← dato
clavenueva ← dato.clave
pav ← arbol // Puntero Avanzado
pret ← NULO // Puntero Retrasado
Metodología de la Programación. Curso 2002/03. Pág. 100
MIENTRAS (pav ≠ NULO) HACER
pret ← pav
ele = pav^.elem
SI (clavenueva < ele.clave ) ENTONCES
pav ← pav^.izq // Voy hacia el hijo izquierdo
EN OTRO CASO
pav ← pav^.dch // Voy hacia el hijo derecho
FINSI
FINMIENTRAS
ele = pret^.elem
SI (clavenueva < ele.clave ) ENTONCES
pret ^.izq ← nuevonodo // Inserto en el hijo izquierdo
EN OTRO CASO
pret ^.dch ← nuevonodo // Inserto en el hijo izquierdo
FINSI
FIN
Metodología de la Programación. Curso 2002/03. Pág. 101
PROC InsertarABB(↓↑arbol:TABB; ↓dato:TElemento)VARIABLES
ele:TElementoINICIO // Solución Recursiva
SI (ABBVacio(arbol)) ENTONCESarbol ← NUEVO(TNodoABB)arbol^.izq ← NULOarbol^.der ← NULOarbol^.elem ← dato
EN OTRO CASOele = InfoABB(arbol)SI (dato.clave < ele.clave) ENTONCES
InsertarABB(arbol^.izq, dato)EN OTRO CASO
InsertarABB(arbol^.dch, dato)FINSI
FINSIFIN
¿Por qué usamos ¿Por qué usamos arbol^.izqy y arbol^.dch en vez de en vez de IzqABB(arbol) y y DechABB(arbol)??
Metodología de la Programación. Curso 2002/03. Pág. 102
Consideraciones acerca de la operación de suprimir.• 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
Metodología de la Programación. Curso 2002/03. Pág. 103
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 SuprimirABB(↓↑arbol:TABB; ↓c:TClave)VARIABLES // Solución Iterativa
pav,pret:TABBINICIO
pav ← arbolpret ← NULO //Busco el elementoMIENTRAS (pav ≠ NULO) ∧ (pav^.elem.clave ≠ c) HACER
pret ← pavSI (c < pav^.elem.clave) ENTONCES
pav ← pav^.izqEN OTRO CASO
pav ← pav^.derFINSI
FINMIENTRASSI (pav = NULO) ENTONCES
// No hacer Nada, ya que no hay nada que borrarSINO SI (pav = arbol) ENTONCES // equivalente a: (pret = NULO)
SuprimirNodo(arbol)SINO SI (pret^.izq = pav) ENTONCES
SuprimirNodo(pret^.izq)EN OTRO CASO
SuprimirNodo(pret^.der)FINSI
FIN
Metodología de la Programación. Curso 2002/03. Pág. 104
PROC SuprimirNodo(↓↑arbol:TABB)Variables // Solución Iterativa
temp,ant:TABB
Inicio
temp ← arbol
SI (arbol^.der = NULO) ENTONCES
arbol ← arbol^.izq // Casos sin Hijos ó sin Hijo derecho
SINO SI (arbol^.izq = NULO) ENTONCES
arbol ← arbol^.der // Caso de Sólo Hijo derecho
EN OTRO CASO // Caso Hijos derecho y izquierdo
temp ← arbol^.izq // Busco el mayor hijo derecho del hijo izquierdo
ant ← arbol
MIENTRAS (temp^.der <> NULO) HACER
anterior ← temp
temp ← temp^.der
FINMIENTRAS
arbol^.elem ← temp^.elem
SI (anterior = arbol) ENTONCES
anterior^.izq ← temp^.izq
EN OTRO CASO
anterior^.der ← temp^.izqFINSI
FINSIELIMINAR(temp)
FIN
0 o 1 hijo
1 hijo
2 hijos
Metodología de la Programación. Curso 2002/03. Pág. 105
PROC SuprimirABB(↓↑arbol:TABB; ↓c:TClave)// Solución Recursiva
VARIABLES
ele:TElemento
INICIO
SI (ABBVacio(arbol)) ENTONCES
// No hacer Nada, ya que no hay nada que borrar
EN OTRO CASO
ele = InfoABB(arbol)
SI (ele.clave = c) ENTONCES
SuprimirNodo(arbol)
SINO SI (c < ele.clave ) ENTONCES
SuprimirABB(arbol^.izq,c)
EN OTRO CASO
SuprimirABB(arbol^.dch,c)
FINSI
FINSI
FIN¿Por qué usamos ¿Por qué usamos arbol^.izqy y arbol^.dch en vez de en vez de IzqABB(arbol) y y DechABB(arbol??
Metodología de la Programación. Curso 2002/03. Pág. 106
PROC SuprimirNodo(↓↑arbol:TABB) // Solución RecursivaVariables
temp:TABBele :TElementoFUNC MayorHijoDerecho(↓arbol:TipoABBúsqueda):TElementoINICIO // Solución Recursiva
SI (ABBVacio(DchABB(arbol))) ENTONCESRESULTADO ← InfoABB(arbol)
EN OTRO CASORESULTADO ← MayorHijoDerecho(DchABB(arbol))
FINSIFIN
INICIOSI (arbol^.der = NULO) ENTONCES
temp ← arbolarbol ← arbol^.izq// Casos sin Hijos ó sin Hijo derechoELIMINAR(temp)
SINO SI (arbol^.izq = NULO) ENTONCEStemp ← arbolarbol ← arbol^.der// Caso de Sólo Hijo derechoELIMINAR(temp)
EN OTRO CASO // Caso Hijos derecho y izquierdoele ← MayorHijoDerecho(IzqABB(arbol))arbol^.elem ← eleSuprimirABB(arbol^.izq,ele.clave)
FINSIFIN Metodología de la Programación. Curso 2002/03. Pág. 107
Metodología de la Programación. Curso 2002/03. Pág. 108
Consideraciones acerca de la operación de imprimir.
• 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?.
Metodología de la Programación. Curso 2002/03. Pág. 109
• 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 procesarlo3) 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 PreOrden3) 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 PostOrden3) "Visitar" el valor del nodo raiz y procesarlo
PROC Imp_InOrden(↓arbol:TABB)INICIO
SI (¬ABBVacio(arbol)) ENTONCES
Imp_InOrden(IzqABB(arbol))
ImpNodo(InfoABB(arbol))
Imp_InOrden(DerABB(arbol))
FINSI
FIN
PROC Imp_PreOrden(↓arbol:TABB)INICIO
SI (¬ABBVacio(arbol)) ENTONCES
ImpNodo(InfoABB(arbol))
Imp_PreOrden(IzqABB(arbol))
Imp_PreOrden(DerABB(arbol))
FINSI
FIN
Metodología de la Programación. Curso 2002/03. Pág. 110
PROC Imp_PostOrden(↓arbol:TABB)INICIO
SI (¬ABBVacio(arbol)) ENTONCES
Imp_PostOrden(IzqABB(arbol))
Imp_PostOrden(DchABB(arbol))
ImpNodo(InfoABB(arbol))
FINSI
Fin
PROC ImprimirABB(↓arbol:TABB; ↓rec:TRecorrido)Inicio
CASE rec SEA
inorden: Imp_InOrden(arbol)
preorden: Imp_PreOrden(arbol)
postorden: Imp_PostOrden(arbol)
FINCASO
Fin
Fin /* MArbolBinarioBusqueda */
Metodología de la Programación. Curso 2002/03. Pág. 111
Metodología de la Programación. Curso 2002/03. Pág. 112
Ejemplo:
• El recorrido InOrden mostraría: BFGHPRSTWYZ
• El recorrido PreOrden: PFBHGSRYTWZ
• El recorrido PostOrden: BGHFRWTZYSP
Y
T
P
F
B H
GZ
W
R
S
Metodología de la Programación. Curso 2002/03. Pág. 113
Nivel de utilización• Aplicaciones en las que estén implicas operaciones
de búsqueda de elementos• Ejemplo: Supongamos que deseamos implementar
un 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 la Programación. Curso 2002/03. Pág. 114
ALGORITMO Diccionario
DESE MABB IMPORTA TABB, CrearABB, DestruirABB, BuscarABB,InsertarABB, SuprimirABB, ImprimirABB
CONSTANTES
MAXCAD = 20
TIPOS
TCadena = ARRAY [0..MAXCAD-1] DE CARÁCTER
TDic = TABB
Tclave = TCadena
TElemento = REGISTRO
clave:TClave // Palabra inglés
traducción: TCadena // Palabra Español
FINREGISTRO
Metodología de la Programación. Curso 2002/03. Pág. 115
PROC InsPalDic(↓↑d:Tdic; ↓pal: TElemento)
INICIO
InsertarABB(d,pal)
FIN
PROC BuscaPalDic(↓d:TDic; ↓inglés:TClave ; ↑pal: TElemento;
↑encontrado:LÓGICO)INICIO
BuscarABB(d,inglés,pal,encontrado)
FIN
PROC BorrarPalDic(↓↑d:TDic; ↓inglés:TClave)INICIO
SuprimirABB(d,inglés)
FIN
Metodología de la Programación. Curso 2002/03. Pág. 116
• [DALE89b] DALE, N y LILLY, S. C. Pascal y Estructurasde Datos. Segunda Edición. McGraw-Hill/Interamericanade España, 1989.
• [JOYA00] JOYANES, L. Programación en C++.Algoritmos, estructuras de datos y objetos. McGraw Hill,2000.
• [SAVI00] SAVICH, W. Resolución de problemas conC++. Segunda Edición. Prentice Hall, 2000.
• [STRO01] STROUSTRUP, B. El lenguaje deprogramación C++. Edición Especial, Adisson-Wesley,2001.