Estructura de Datos
Estructura de Datos
ESTRUCTURA DE DATOS
Viveros de Asís 96, Col. Viveros de la Loma, Tlalnepantla, C.P. 54080, Estado de México.
Prohibida la reproducción parcial o total por cualquier medio, sin la autorización por escrito del titular
de los derechos.
Estructura de datos
ISBN 978-607-733-129-2
DIRECTORIO
Introducción 4
Mapa conceptual 6
Unidad 1. Arreglos 7
Mapa conceptual 8
Introducción 9
1.1. Conceptos 10
1.2. Arreglos unidimensionales 11
1.3. Arreglos bidimensionales 16
1.4. Arreglos de tres o más dimensiones 19
Autoevaluación 23
2
Unidad 4. Listas 56
Mapa conceptual 57
Introducción 58
4.1. Representación en memoria 59
4.2. Listas enlazadas 59
4.3. Listas doblemente enlazadas 64
4.4. Operaciones con listas 66
4.5. Problemas 69
Autoevaluación 73
Unidad 5. Árboles 74
Mapa conceptual 75
Introducción 76
5.1. Terminología 77
5.2. Árboles binarios y representaciones gráficas 78
5.3. Recorrido de un árbol 81
5.4. Árboles enhebrados 83
5.5. Árboles de búsqueda 85
5.6. Problemas 86
Autoevaluación 107
Bibliografía 118
Glosario 119
3
INTRODUCCIÓN
4
grafos, que son estructuras dinámicas que nos permitirán trabajar con
almacenamientos secundarios. Asimismo, se introducirá sobre el uso de los
grafos, su empleo y creación dentro de un lenguaje de programación.
5
MAPA CONCEPTUAL
Estructura de Datos
emplea
Técnicas
de emplean
Inserción-
Unidimension 3 o más Binarios Enhebrados
Remoción
al dimensiones
de Para
Bidimension
para
al
Obtener Comprender
para sus
de
Manejo Datos Características
6
UNIDAD 1
ARREGLOS
OBJETIVO
Analizar el uso e implementación de los arreglos para la resolución de
problemas de datos estructurados, mejorando el tiempo de desarrollo y eficacia
de los sistemas.
TEMARIO
1.1. CONCEPTOS
1.2. ARREGLOS UNIDIMENSIONALES
1.3. ARREGLOS BIDIMENSIONALES
1.4. ARREGLOS DE TRES O MÁS DIMENSIONES
7
MAPA CONCEPTUAL
Arreglos
se
es
clasifican
Colección
en
Unidimensional 3 o mas
Finita Ordenada
Dimensiones
Homogénea
Bidimensional
de para
los
datos Almacenar
8
INTRODUCCIÓN
9
1.1. CONCEPTOS
Un arreglo es una estructura de datos lineal, “un arreglo puede definirse como
un grupo o una colección finita, homogénea y ordenada de elementos.”1 Donde
finita significa que debe tener un límite de elementos, homogénea que los
elementos deben de ser del mismo tipo de datos, y ordenada porque se puede
conocer cuál es el primer elemento, los subsiguientes o el último.
En la siguiente gráfica puede observarse cómo se representa un arreglo
y se identifican las partes que lo integran.
No. Elemento
0 1 2 3 ……. n
Elementos
Fig.1.1. Representación de un arreglo
1
Osvaldo Cairó /Silvia Guardati , Estructuras de datos, pág. 4
10
Indice
0 1 2 3 ……. n
Datos
12 22 45 77
11
Definición de un arreglo. La forma correcta de resolver el anterior
problema, sería empleando un arreglo. ¿Pero cómo se definen?, esto depende
principalmente del lenguaje de programación que utilicemos, para cuestiones
de estudio, la mayoría de los autores sobre este tema emplean una sintaxis
generalizada de la siguiente forma:
Donde:
Arreglo. Es la palabra reservada para crear los arreglos
Nombre_Arreglo. Representa el Nombre que emplearemos para
referirnos al arreglo
Limite_Inferior y Limite_Superior. Representan el número Índice para
indicar el inicio y fin del arreglo, es decir, un rango, por ejemplo del [1 .. 3 ] o [5
.. 20].
Tipo. Es el tipo de datos que almacenará ese arreglo, hay que recordar
que los arreglos son homogéneos y pueden ser cualquier tipo ordinal (cadena,
entero, booleano, real, etc.)
Como ya se ha mencionado, manejaremos la sintaxis empleado en el
lenguaje JAVA, donde los arreglos se definen de la siguiente forma:
12
La representación gráfica del anterior arreglo, se presenta en la siguiente
ilustración:
Índice
0
1
2
3
Edad 4
5
… ….
9
9
Fig. 1.3. Arreglo de 100 posiciones
Edad [ 0 ] = 33;
13
Para actualizar el contenido de un componente del arreglo, sólo basta
con reasignarle el valor, como una variable simple, el anterior valor se elimina
para dar paso al nuevo valor.
Otra forma de crear arreglos, es empleando la asignación directa de la
forma:
14
menor, ordenar las cadenas alfabéticamente, etc. Los métodos de
ordenamiento serán abordados con detalle más adelante.
Continuando con el ejemplo de las edades, se presenta el código para la
solución en pseudocódigo y Java:
Inicio
Definir Max 100
definir arreglo “Arreglo_Edad”
desde i=0 hasta i < Max
leer Edad;
Arreglo_edad[ i ] edad
Suma Suma + Arreglo_edad [ i ]
Fin_desde
PromedioSuma/Max
Des i=0 hasta i < Max
Tempo Arreglo_Edad[i]
Si Tempo > Promedio entonces
Arriba_Prom=Arriba_Prom + 1
Fin_Si
Fin_desde
Imprimir Arriba_Prom
Fin_Inicio
1 import javax.swing.JOptionPane;
2
3 public class ArregloUni {
4 public static void main(String[] args) {
5 int Max=100, Suma=0, Promedio=0,Tempo=0, Arriba_Prom=0;
6 String Edad;
7 int Arreglo_Edad[]=new int[Max]; // Declaraccion del arreglo
8 for (int i=0; i<Max;i++){
9 Edad= JOptionPane.showInputDialog("Edad:");
10 Arreglo_Edad [ i ] = Integer.parseInt (Edad);
11 Suma += Arreglo_Edad [ i ];
12 }
15
13 Promedio=Suma/Max;
14
15 for (int i=0; i<Max;i++){
16 Tempo=Arreglo_Edad[i];
17 if (Tempo>Promedio){
18 Arriba_Prom++;
19 }
20 }
21
22 JOptionPane.showMessageDialog(null, "El número de edades arriba
del promedio es "+Arriba_Prom);
23
24 }
25 }
ACTIVIDAD DE APRENDIZAJE
1.- Desarrolla un programa que permita la captura de las ventas de un
Comisionista de forma mensual, mostrando al final la venta Promedio, la venta
más alta y la más baja.
16
índices. El primero se utiliza generalmente para indicar renglón, y el segundo
para indicar columnas. También puede definirse como un arreglo de arreglos.”2
Un arreglo bidimensional (también conocido como tabla o matriz), es un
arreglo con dos índices, al igual que los vectores que deben ser ordinales.
Es común destacar que el empleo de los arreglos de dos dimensiones se
emplea para la construcción de tablas, en la cual están representadas por filas
y columnas. Como se mencionó, para localizar o almacenar un valor en el
arreglo se deben especificar dos posiciones (dos subíndices), uno para la fila y
otro para la columna.
Arreglo [ Fila, Columna ]
La definición de un arreglo bidimensional quedaría con la siguiente
sintaxis:
Tipo Nombre_Arreglo [ ] [ ] = new Tipo [Tam_Arreglo_Fila]
[Tam_Arreglo_Columna];
0 1 2 3
1 [ 1,0 ]
2 [ 2,0 ]
3 [ 3,0 ] [ 3,3 ]
4 [ 4,0 ]
… [ m,0 ] [ n, m ]
m
Fig. 1.4. Representación gráfica de un arreglo bidimensional
2
Osvaldo Cairó /Silvia Guardati, Estructuras de datos, p. 19.
17
Por ejemplo, necesitamos una matriz donde se almacenen las
calificaciones de 30 personas, conteniendo cinco materias y su matrícula. La
estructura del arreglo quedaría de la siguiente forma:
String Datos[]=
{“Matricula”,”;Materia1”,”Materia2”,”Materia3”,”Materia4”,”Materia5”};
int Registros [ ] [ ] = new int [ 30 ][ Datos.length ];
1 import javax.swing.JOptionPane;
2
3 public class Bidi {
4
5 public static void main(String[] args) {
6 int NoAlumno=2;
7 String DatoSimple;
8 String Datos[ ] = { "Matricula","Materia 1","Materia 2","Materia
3",
"Materia 4","Materia 5" };
9 int Registros [ ] [ ] = new int [ 30 ][ Datos.length ];
10
11 int Arreglo_Edad[]=new int[NoAlumno];
12 for (int i=0; i<NoAlumno;i++){
13 for (int j=0; j<Datos.length; j++) {
14 DatoSimple=JOptionPane.showInputDialog("Ingresa la "
+ Datos[ j ] + " del alumno"+ (i+1));
18
15 Registros[i][j]=Integer.parseInt(DatoSimple);
16 }
17 }
18
19 JOptionPane.showMessageDialog(null, "Datos capturados
completamente...");
20
21 }
22
23 }
ACTIVIDAD DE APRENDIZAJE
1. Desarrolla un programa que permita la captura de las ventas de 30
Comisionistas de forma mensual, mostrando al final la venta Promedio, la venta
más alta y más baja.
19
Posición 0,0,1
Fig. 1.5. Representación grafica de un arreglo de tres Posición
dimensiones 0,1,2
Posición 0,0,0
Para conocer el
número total de
elementos en un tipo
de arreglos
multidimensionales se
emplea la siguiente
fórmula:
No. TOTAL DE
ELEMENTOS = D1 *
D2* D3 * ...* Dn
donde:
Posición 4,0,0
D1, D2, D3…Dn= No. total de dimensiones
20
0,0,4 0,1,4
1,0,4 1,1,4
2,0,4 2,1,4
0,0,3 0,1,3
1,0,3 1,1,3
2,0,3 2,1,3
0,0,2 0,1,2
1,0,2 1,1,2
2,0,2 2,1,2
0,0,1 0,1,1
1,0,1 1,1,1
Semanas
2,0,1 2,1,1
Productos
0,0,0 0,1,0
1,0,0 1,1,0
2,0,0 2,1,0
Empleados
ACTIVIDAD DE APRENDIZAJE
1.- Desarrolla un programa que permita la captura de las ventas de 20
Comisionista de forma mensual y de cinco productos diferentes, mostrando al
final la venta Promedio, la venta más alta y más baja de cada vendedor.
22
AUTOEVALUACIÓN
1.- Puede definirse como un grupo o una colección ( ) int x [ ] [ ]= int [3][4];
finita, homogénea y ordenada de elementos.
Respuesta: 6, 5, 10, 1, 9, 8, 2, 7, 3, 4.
23
UNIDAD 2
PILAS Y COLAS
OBJETIVO
Comprender los conceptos de Pilas y Colas, analizando las formas de manejar
el acceso a datos, partiendo de sus fundamentos básicos.
TEMARIO
2.1. DEFINICIONES Y REPRESENTACIONES
2.2. NOTACIONES INFIJAS, PREFIJAS, POSTFIJAS EN EXPRESIONES
2.3. INSERCIÓN Y REMOCIÓN DE DATOS EN UNA PILA (LIFO)
2.4. INSERCIÓN Y REMOCIÓN DE DATOS EN UNA COLA SIMPLE Y CIRCULAR
2.5. PROBLEMAS
24
MAPA CONCEPTUAL
Estructura de Datos
emplea
Conceptos
de
Pilas Colas
es
25
INTRODUCCIÓN
26
2.1. DEFINICIONES Y REPRESENTACIONES
Uno de los conceptos que más se emplean en las estructuras de datos lineales,
en la elaboración de programas, son las pilas. Éstas son aplicadas en cuanto a
las restricciones sobre el acceso a los datos del arreglo, ya sea para insertar o
eliminar elementos, actualizando el contenido de los registros.
Iniciemos por definir el término fundamental de una pila como “una lista
de elementos en la cual se puede insertar y eliminar elementos sólo por uno de
los dos extremos.”3
Para tener una comprensión más clara de lo que es una pila, imagine el
acomodo de latas de un producto X en un centro comercial. O bien el
apilamiento de libros en una biblioteca.
Productos
“La
tiendita”
Productos Productos
“La “La
tiendita” tiendita”
Productos Productos Productos
“La “La “La
tiendita” tiendita” tiendita”
27
tiempo de compilación y ejecución de Pascal, utiliza una pila para llevar la
cuenta de los parámetros de procedimientos y funciones, variables locales,
globales y dinámicas. Este tipo de estructuras también son utilizadas para
traducir expresiones aritméticas o cuando se quiere recordar una secuencia de
acciones u objetos en el orden inverso del ocurrido.
Ahora conoceremos el concepto de Cola y se definirá como “una
estructura de almacenamiento donde los datos van a ser insertados por un
extremo y serán extraídos por otro”.4 El concepto anterior se puede simplificar
como FIFO (first-in, first-out), esto es, el primer elemento en entrar debe ser el
primero en salir.
Los ejemplos sobre este mecanismo de acceso, son visibles en las filas
de un banco, los clientes llegan (entran) se colocan en la fila y esperan su turno
para salir.
ACTIVIDAD DE APRENDIZAJE
1.-Realizar una investigación y entregar un resumen donde se comprenda el
concepto pilas y colas.
4
Goodrich/Tamassia, Estructura de datos y algoritmos en Java, p. 215.
28
2.2. NOTACIONES INFIJAS, PREFIJAS, POSTFIJAS EN EXPRESIONES
29
Ejemplo de conversión de expresiones fijas a postfija
ACTIVIDAD DE APRENDIZAJE
1.- Realizar una investigación y entregar un resumen, donde se comprenda el
concepto de las notaciones.
Arreglos.
Listas enlazadas.
30
último elemento insertado en la pila, el cual se denomina SP. La representación
gráfica de una pila es la siguiente, denotando como TOPE al T-enésimo
elemento de la pila que se inserta:
Pila
32
22
33 Tope
56
56 33 22 32
Lleno (Pila).
Vacio (Pila).
Agregar (Elementos, Pila).
Eliminar (Pila).
31
Pseudocódigo 1.- Vacía (Pila, Tope, Res1)
// Este algoritmo verifica si la pila tiene datos, asignando a Res1 el valor de
verdadero
Si Tope=0 entonces
Res1 Verdadero
Si_no
Res1 Falso
Fin_Si
32
Tope Tope - 1
Dato Pila[Tope]
Fin_Si
ACTIVIDAD DE APRENDIZAJE
1. Desarrolla un programa que permita controlar los autos que entran en un
estacionamiento, empleando el número de placa, a través de pilas.
Como arreglos.
Como listas ordenadas.
Al igual que las pilas, trataremos las colas como arreglos, en donde
debemos definir el tamaño de la cola y dos apuntadores, uno para accesar el
primer elemento de la lista y otro que guarde el último. En lo sucesivo, al
apuntador del primer elemento se le denominará Inicial, al de el último
elemento Final y Max, para definir el número máximo de elementos en la cola.
La cola lineal es un tipo de almacenamiento creado por el usuario que
trabaja bajo la técnica FIFO (primero en entrar primero en salir). Las colas
lineales se representan gráficamente de la siguiente manera:
33
32 Inicial
22
33 Final
56
56 33 22 32
Max
Fig. 2.3. Representación gráfica de una Cola
Insertar.
Eliminar.
34
Hay que recordar siempre que la inserción se realiza al Final de la cola,
mientras que en Inicial llevará el control de las eliminaciones.
Algoritmos 1. InsertarDato
Si Final < Max entonces
Final Final + 1
Cola [ Final ] Dato
Si Final=1 entonces
Inicial 1
Si_no
Mostrar “Error”
Fin_si
Fin_si
Colas circulares
Las colas lineales tienen un grave problema, como las extracciones sólo
pueden realizarse por un extremo, puede llegar un momento en que el
apuntador Inicial sea igual al máximo número de elementos en la cola, siendo
que al frente de la misma existan lugares vacíos, y al insertar un nuevo
elemento nos mandará un error.
35
Inicial Final
32
Max
Fig. 2.4.- Problemas con las Colas al llegar al elemento final
Inicial Final
Inicial
21 45 12 32 56 21 45 12 32
36
Final Final +1
Fin_Si
ColaCir[Final]Datos
Si Frente=0 entonces
Frente1
Fin_Si
Fin_Si
ACTIVIDAD DE APRENDIZAJE
1. Desarrolla un programa que permita controlar los autos que entran en un
estacionamiento, empleando el número de placa, a través de colas circulares.
2.5 PROBLEMAS
37
Problema 1. Empleando las estructuras de datos, analizar el siguiente
programa que permite la captura y eliminación de códigos de libros, en un
arreglo de 10 elementos controlando los accesos través de pilas.
import javax.swing.JOptionPane;
public Libros(){
int op=0;
while(op!=4){
op=Integer.parseInt(JOptionPane.showInputDialog(
"Opciones Para La Pila" +
"\n [1] Agregar Dato" +
"\n [2] Eliminar Dato" +
"\n [3] Mostrar Pila" +
"\n [4] Terminar"
));
switch(op){
case 1:{AgregarPila(); break;}
case 2:{BorrarPila(); break;}
case 3:{MostrarPila(); break;}
}
}
}
38
public void AgregarPila(){
PilaLleno();
if (Res1==true){
JOptionPane.showMessageDialog(null, "Pila Llena");
} else{
Dato=JOptionPane.showInputDialog("Codigo:");
Pila[Tope]=Integer.parseInt(Dato);
Tope++;
}
}
39
}
import javax.swing.JOptionPane;
public Clientes(){
int op=0;
while(op!=4){
op=Integer.parseInt(JOptionPane.showInputDialog(
"Opciones el registro de clientes" +
"\n [1] Agregar Dato" +
40
"\n [2] Eliminar Dato" +
"\n [3] Mostrar Elementos" +
"\n [4] Terminar"
));
switch(op){
case 1:{AgregarCola(); break;}
case 2:{BorrarCola(); break;}
case 3:{MostrarCola(); break;}
}
}
}
41
if(Frente!=-1){
JOptionPane.showMessageDialog(null, "Dato eliminado "+Cola[Frente]);
Cola[Frente]=0;
if (Frente==(Final-1)){
System.out.print(Frente+"-"+Final);
Frente=-1;
Final=0;
} else {
Frente++;
}
}
else {
JOptionPane.showMessageDialog(null,"Datos Vacios");
}
}
}
AUTOEVALUACIÓN
42
esperan su turno para salir.
Respuestas: 6, 7, 2, 5, 3, 4, 1
43
UNIDAD 3
OBJETIVO
Identificar y analizar los métodos más comunes para el ordenamiento y las
búsquedas de la información dentro de estructuras de datos.
TEMARIO
3.1. MÉTODO DE BURBUJA
3.2. MÉTODO SHELL
3.3. MÉTODO DE QUICKSORT
3.4. BÚSQUEDA SECUENCIAL
3.5. BÚSQUEDA BINARIA
44
MAPA CONCEPTUAL
Métodos de Ordenamiento
es realiza
aplicado Estudio
a de
Métodos
Arreglar u
ordenar de
los
Shell Burbuja
registros
en QickSort
base
a
para
criterio valores
el
Mejorar
45
INTRODUCCIÓN
46
3.1. MÉTODO DE BURBUJA
Este método consiste en acomodar los vectores moviendo el mayor hasta la
última casilla, comenzando desde la casilla cero, esto se logra comparando
valores de llaves y al intercambiarlos si no están en una posición relativa
correcta.
Este algoritmo es muy deficiente ya que al ir comparando las casillas
para buscar el siguiente más grande, éste vuelve a comparar las ya ordenadas.
A pesar de ser el algoritmo de ordenamiento más deficiente que hay, éste es el
más usado en todos los lenguajes de programación.
Este método logra la idea básica de la burbuja, que cada valor flote a su
posición adecuada mediante comparaciones en pares. Cada paso hace que el
valor suba a su posición final, como una burbuja. Ilustremos el concepto con los
siguientes valores:
4
7
3
2
9
1
6
Como se ha dicho, la burbuja sube, por lo que cada valor se compara
con el que se encuentra arriba de ella, y se intercambia, si la de arriba es más
pequeña, después de una pasada, habrá cambios en el ordenamiento como se
ilustra a continuación:
47
Después del primer ordenamiento se obtiene el número más alto y
reinician la comparación desde el último valor hasta completar un ciclo de n
veces.
Algoritmo:
Repetir con I desde 2 hasta N
Repetir con J desde N hasta I
Si A [ J – 1 ] > A [ J ] entonces
Tempo A [ J-1 ]
A [ J-1 ] A [ I ]
A [ I ] Tempo
Fin_Si
Fin_Repetir
Fin_Repetir
48
ACTIVIDAD DE APRENDIZAJE
1. Desarrolla un programa que permita ingresar y ordenar la siguiente
numeración 33, 45, 67, 8, 12, 32, 56, 7, 9, 10, 22, 45, 98, 9. De forma
ascendente y descendente, usando el método de burbuja.
La ordenación produce:
15, 21, 08, 16, 44, 27, 07, 10, 56, 67, 13, 28, 60, 36, 12, 35
La ordenación produce:
15, 21, 07, 10, 44, 27, 08, 16, 56, 36, 12, 28, 60, 67, 13, 35
La ordenación produce:
07, 10, 08, 16, 12, 21, 13, 27, 15, 28, 44, 35, 56, 36, 60, 67
49
Cuarta Pasada.- Divida los elementos en un solo grupo.
La ordenación produce:
07, 08, 10, 12, 13, 15, 16, 21, 27, 28, 35, 36, 44, 56, 60, 67
ACTIVIDAD DE APRENDIZAJE
1. Realizar y entregar una investigación sobre el método Shell con ejemplos
2. Desarrolla un programa que permita ingresar y ordenar la siguiente
numeración 33, 45, 67, 8, 12, 32, 56, 7, 9, 10, 22, 45, 98, 9. De forma
ascendente y descendente, usando el método de Shell.
50
{21,10,4,9,40,35}
El ciclo de las búsquedas se reinicia encontrando el valor 40 como
mayor, y el valor 9 como el elemento menor, en este caso ya se cruzaron las
búsquedas, así que se procede a cruzar el menor con el pivote, quedando:
{9,10,4,21,40,35}
Partiendo del punto del pivote, dividiremos el arreglo en otros dos más
pequeños {9,10,4} y el {40,35}, ahora el método de ordenamiento QuickSort se
aplica a cada uno de los arreglos.
ACTIVIDAD DE APRENDIZAJE
1. Realizar y entregar una investigación sobre el método Quicksort con
ejemplos.
2. Desarrolla un programa que permita ingresar y ordenar la siguiente
numeración 33, 45, 67, 8, 12, 32, 56, 7, 9, 10, 22, 45, 98, 9. De forma
ascendente y descendente, usando el método de Quicksort.
51
efectividad y velocidad se incrementa si los elementos de un arreglo ya se
encuentran ordenados, esto es porque reduce el área de búsqueda eliminando
los registros que están sobre el elemento clave.
Algoritmo:
Iniciar
I1
BanderaFalso
Repetir mientras (I<=N) y (Bandera=Falso)
Si V [ I ] =X entonces Bandera=Verdadedo
Si_no I=I+1
Fin_si
Fin_Repetir
Si Bandera=Verdadero entonces
Mostrar “Elemento en la Posición I”
Si_no
Mostrar “Elemento no encontrado”
Fin_si
Fin_Inicio
ACTIVIDAD DE APRENDIZAJE
1. Realizar y entregar una investigación sobre el término búsqueda y
búsquedas secuenciales.
2. Desarrolla un programa que permita ingresar siguiente 30 números. Luego
debe permitir realizar la búsqueda de uno de los números, cualesquiera,
empleando la búsqueda secuencial.
52
Este algoritmo está altamente recomendado para buscar en arreglos
enormes: En uno de 50 000 000 elementos, tarda 26 iteraciones en ejecutarse
1, suponiendo que la búsqueda falla, sino, siempre tarda menos en buscarlo.
Para implementar este algoritmo, se compara el elemento a buscar con
un elemento cualquiera del arreglo (normalmente el elemento central), si el
valor de éste es mayor que el del elemento buscado, se repite el procedimiento
en la parte del arreglo que va desde el inicio de éste hasta el elemento tomado,
en caso contrario se toma la parte del arreglo que va desde el elemento
tomado hasta el final. De esta manera obtenemos intervalos cada vez más
pequeños, hasta que se obtenga un intervalo indivisible, con el elemento
buscado como elemento central. Si el elemento no se encuentra dentro de este
último, entonces se deduce que el elemento buscado no se encuentra en el
arreglo.
Si la tabla de números está ordenada, por ejemplo, en orden creciente,
es posible utilizar para la búsqueda un algoritmo más eficiente que se basa en
un concepto muy utilizado en la programación: dividir para vencer.
Si está ordenada la tabla y miramos el número situado en la mitad para
ver si es mayor o menor que el número buscado (o con suerte igual), sabremos
si la búsqueda ha de proceder en la subtabla con la mitad de tamaño que está
antes o después de la mitad. Si se repite recursivamente el algoritmo al final o
bien encontraremos el número sobre una tabla de un sólo elemento, o
estaremos seguros de que no se encuentra allí.
53
IzqCen+1
Si_no
Der Cen-1
Fin_si
Fin_si
Fin_si
Si (Bandera=Verdadero) entonces
Mostrar “Elemento en la posición Cen”
Si_No
Mostrar ”Elemento no está en registro”
Fin_si
Fin_Inicio
ACTIVIDAD DE APRENDIZAJE
1. Realizar y entregar una investigación sobre el términos búsqueda binaria.
2. Desarrolla un programa que permita ingresar 30 números. Luego debe
permitir realizar la búsqueda de uno de los números, cualesquiera, empleando
la búsqueda binaria.
54
AUTOEVALUACIÓN
55
UNIDAD 4
LISTAS
OBJETIVO
Definir y analizar el uso de listas simples, sus variantes y operaciones básicas
para el acceso a datos.
TEMARIO
4.1. REPRESENTACIÓN EN MEMORIA
4.2. LISTAS ENLAZADAS
4.3. LISTAS DOBLEMENTE ENLAZADAS
4.4. OPERACIONES CON LISTAS DOBLEMENTE ENLAZADA
4.5. PROBLEMAS
56
MAPA CONCEPTUAL
Listas
e d
s e
tipo
Estructura
usa
tipo
Por se
que Doble Enlazadas
Cambiar divide
la una la
d
Cantidad
e Liga Información
57
INTRODUCCIÓN
Hasta este punto se han visto las estructuras de datos presentadas por
Arreglos, Pilas y Colas, éstas son denominadas estructuras estáticas, porque
durante la compilación se les asigna un espacio de memoria, y éste permanece
inalterable durante la ejecución del programa.5
En la siguiente unidad se muestra la estructura de datos “Lista”. La cual
es un tipo de estructura lineal y dinámica de datos. Lineal debido a que a cada
elemento le puede seguir sólo otro elemento, y dinámica porque se puede
manejar la memoria de manera flexible, sin necesidad de reservar espacio con
anticipación.6
Una de las principales ventajas de manejar un tipo dinámico es que se
pueden obtener posiciones de memoria a medida que se va trabajando con el
programa, y éstas se liberan cuando ya no se requiere, de ese modo se crea
una estructura más dinámica que cambia dependiendo de la necesidad, según
se agreguen o eliminen elementos.
Lo anterior solucionaría en gran manera el manejo de los espacios en
memoria, necesarios para la solución de problemas y así optimizar el uso de
los recursos del sistema, es importante destacar que las estructuras dinámicas
no pueden reemplazar a los arreglos en todas sus aplicaciones. Hay casos
numerosos que podrían ser solucionados, de modo fácil, aplicando arreglos, en
tanto que si se utilizaran estructuras dinámicas, como las listas, la solución de
tales problemas se complicaría.
5
Cfr. http://sistemas.itlp.edu.mx/tutoriales/estructuradedatos/t33.html
6
Cfr. http://sistemas.itlp.edu.mx/tutoriales/estructuradedatos/t33.html
58
4.1. REPRESENTACIÓN EN MEMORIA
La Lista Lineal es una estructura dinámica, donde el número de nodos en una
lista puede variar a medida que los elementos son insertados y removidos, el
orden entre estos se establece por medio de un tipo de datos denominado
punteros, apuntadores, direcciones o referencias a otros nodos, es por esto
que la naturaleza dinámica de una lista contrasta con un arreglo que
permanece en forma constante.
Información
Pepe 7
Liga
Fig. 4.1. Representación gráfica de un nodo.
Búsqueda
Inserción
Eliminación
Recorrido
Una lista enlazada se puede definir como una colección de nodos o elementos.
“El orden entre estos se establece por medio de punteros; esto es, direcciones
59
o referencias a otros nodos. Un tipo especial de lista simplemente ligada es la
lista vacía.”7
“El apuntador al inicio de la lista es importante porque permite
posicionarnos en el primer nodo de la misma y tener acceso al resto de los
elementos. Si, por alguna razón, este apuntador se extraviara, entonces
perderemos toda la información almacenada en la lista. Por otra parte, si la lista
simplemente ligada estuviera vacía, entonces el apuntador tendrá el valor
NULO.”8
null
Fig. 4.2. Representación gráfica de una lista enlazada.
Dentro de las listas se pueden mencionar a las listas con cabecera, las
cuales emplean a su primer nodo como contenedor de un tipo de valor (*, - , +,
etc.). Un ejemplo de lista con nodo de cabecera es el siguiente:
null
Fig. 4.2. Lista enlazada con nodo de cabecera.
7
Cfr. http://nancynohemi.webuda.com/index.php?option=com_content&view=article&id=40&Itemid=41
8
Cfr. http://nancynohemi.webuda.com/index.php?option=com_content&view=article&id=40&Itemid=41
60
primer elemento de la lista, los términos TOP(dato) y TOP(liga) se usan para
referirse al dato almacenado y a la liga del nodo siguiente.
Algoritmo de creación
top<--NIL
repite
new(p)
leer(p(dato))
si top=NIL entonces
top<--p
en caso contrario
q(liga)<--p
p(liga)<--NIL
q<--p
mensaje('otro nodo?')
leer(respuesta)
hasta respuesta=no
61
Algoritmo para insertar antes/después de 'X' información
p<--top
mensaje(antes/despues)
lee(respuesta)
si antes entonces
mientras p<>NIL haz
si p(dato)='x' entonces
new(q)
leer(q(dato))
q(liga)<--p
si p=top entonces
top<--q
en caso contrario
r(liga)<--q
p<--nil
en caso contrario
r<--p
p<--p(link)
si despues entonces
p<--top
mientras p<>NIL haz
si p(dato)='x' entonces
new(q)
leer(q(dato))
q(liga)<--p(liga)
p(liga)<--q
p<--NIL
en caso contrario
p<--p(liga)
p<--top
mientras p(liga)<>NIL haz
p<--p(liga)
new(q)
62
p(liga)<--q
q(liga)<--NIL
63
Algoritmo de extracción en una lista con nodo de cabecera
leer(valor_a_borrar)
p<--cab
q<--cab(liga)
mientras q<>NIL haz
si q(dato)=valor_a_borrar entonces
p<--q(liga)
dispose(q)
q<--NIL
en caso contrario
p<--q
q<--q(liga)
ACTIVIDAD DE APRENDIZAJE
Liga Liga
Mario
Izquierda Derecha
Fig. 4.3. Liga doblemente enlazada.
64
Podemos mencionar a dos tipos de listas del tipo doblemente ligadas,
las cuales se mencionan a continuación:
ACTIVIDAD DE APRENDIZAJE
1. Realizar y entregar una investigación sobre la creación y uso de las listas
doblemente enlazadas.
9
Cfr. http://nancynohemi.webuda.com/index.php?option=com_content&view=article&id=40&Itemid=41
65
2. Desarrolla un programa que permita ingresar 10 nombres, estructurándolo
en una lista doblemente enlazada.
Crear listas.
Buscar valor
Insertar valor
Borrar valor
repite
new(p)
lee(p(dato))
si top=nil entonces
top<--p
q<--p
en caso contrario
q(liga)<--p
q<--p
p(liga)<--top
mensaje (otro nodo ?)
lee(respuesta)
hasta respuesta=no
66
Algoritmo para recorrer la lista
p<--top
repite
escribe(p(dato))
p<--p(liga)
hasta p=top
new(p)
lee(p(dato))
si top=nil entonces
top<--p
p(liga)<--top
en caso contrario
mensaje(antes de ?)
lee(x)
q<--top
r<--top(liga)
repite
si q(dato)=x entonces
p(liga)<--q
r(liga)<--p
si p(liga)=top entonces
top<--p
q<--q(liga)
r<--r(liga)
hasta q=top
67
new(p)
lee(p(dato))
mensaje(después de ?)
lee(x)
q<--top
r<--top(liga)
repite
si q(dato)=x entonces
q(liga)<--p
p(liga)<--r
q<--q(liga)
r<--r(liga)
hasta q=top
mensaje(valor a borrar )
lee(valor_a_borrar)
q<--top
r<--top
p<--top
mientras q(liga)<>top haz
q<--q(liga)
repite
si p(dato)=valor_a_borrar entonces
si p=top entonces
si top(liga)=top entonces
top<--NIL
en caso contrario
top<--top(liga)
q(liga)<--top
en caso contrario
r(liga)<--p(liga)
dispose(p)
68
p<--top
en caso contrario
r<--p
p<--p(liga)
hasta p=top
ACTIVIDADES DE APRENDIZAJE
1. Realiza y entrega una investigación sobre las operaciones que soportan las
listas.
2. Desarrolla un programa que permita ingresar 10 nombre estructurándolo en
una lista enlazada circular.
4.5. PROBLEMAS
A continuación recopilaremos ejemplos simples sobre el uso y aplicación de las
listas enlazadas. Primero comenzaremos con un programa que permita
ingresar tres nombres ya definidos en una lista, para luego mostrarlos en modo
consola.
import java.util.*;
list.add("Luisa");
list.add("Maira");
list.add("Andes");
69
Iterator iter = list.iterator();
while (iter.hasNext())
System.out.println(iter.next());
}
}
class DobleEnlace {
static class Node {
String Dato;
Node Siguiente;
Node Previo;
}
topForward.Siguiente = temp;
temp.Siguiente = topBackward;
topBackward.Siguiente = null;
topBackward.Previo = temp;
70
temp.Previo = topForward;
topForward.Previo = null;
temp = topForward;
while (temp != null){
System.out.print (temp.Dato);
temp = temp.Siguiente;
}
System.out.println ();
temp = topBackward;
while (temp != null){
System.out.print (temp.Dato);
temp = temp.Previo;
}
System.out.println ();
temp = topForward.Siguiente;
temp.Previo.Siguiente = temp.Siguiente;
temp.Siguiente.Previo = temp.Previo;
71
temp = topForward;
while (temp != null){
System.out.print (temp.Dato);
temp = temp.Siguiente;
}
System.out.println ();
temp = topBackward;
while (temp != null){
System.out.print (temp.Dato);
temp = temp.Previo;
}
System.out.println ();
}
}
72
AUTOEVALUACIÓN
4.- El orden entre Listas se establece por medio ( ) Listas simple enlazada
de un tipo de datos denominado
Respuesta: 8, 5, 1, 6, 7, 3, 4, 2
73
UNIDAD 5
ÁRBOLES
OBJETIVO
Comprender la importancia que tienen las estructuras de árboles para la
manipulación de procesos complejos de ordenamiento, búsquedas
secuenciales y binarias, así como su representación gráfica.
TEMARIO
5.1. TERMINOLOGÍA
5.2. ÁRBOLES BINARIOS Y REPRESENTACIONES GRÁFICAS
5.3. RECORRIDO DE UN ÁRBOL
5.4. ÁRBOLES ENHEBRADOS
5.5. ÁRBOLES DE BÚSQUEDA
5.6. PROBLEMAS
74
MAPA CONCEPTUAL
Arboles
es
no
Estructura lineale Tipo
tipo s
o
ramas vértices
75
INTRODUCCIÓN
76
5.1. TERMINOLOGÍA
En términos matemáticos, un árbol es cualquier conjunto de puntos, llamados
vértices, y cualquier conjunto de pares de distintos vértices, llamados lados o
ramas, a una secuencia de ramas, se le conoce como ruta de cualquier vértice
a cualquier otro vértice.
Un árbol es una estructura de datos no lineal, las estructuras de datos
lineales se caracterizan por que a cada elemento le corresponde no más que
un elemento siguiente. En las estructuras de datos no lineales, como el árbol,
un elemento puede tener diferentes “siguientes elementos”, introduciendo una
estructura de bifurcación, también conocidas como estructuras multi enlazada.
En un árbol no hay lazos o sea, que no hay pasos que comiencen en un
vértice y puedan volver al mismo vértice, un árbol puede tener un vértice o
nodo llamado raíz, el cual cumple la función de vértice principal. La
particularidad del nodo raíz es que no puede ser hijo de otro nodo.
Un árbol A es “un conjunto finito de uno o más nodos”,10 tales que:
10
Goodrich / Tamassia , Estructura de datos y algoritmos en java, p. 348.
77
Los sistemas de archivos ( file system ) de los sistemas operativos,
compuestos por jerarquías de directorios y archivos.
La jerarquía de clases en los lenguajes orientados a objetos.
La jerarquía de países, provincias, departamentos y municipios que
organiza al poder político de una república.
Entre los términos más comunes que se emplean al utilizar los árboles,
se pueden destacar los siguientes:11
11
Cfr. http://www.utpl.edu.ec/wikis/matematicas_discretas/index.php/Teoria_de_%C3%81rboles o
http://hellfredmanson.over-blog.es/article-30369340-6.html o
http://boards4.melodysoft.com/app?ID=2005AEDII0405&msg=15&DOC=21
78
34
23 17
87 22
12 34
11 19
21 12
1. B. Distinto.
2. B. Similares.
3. B. Equivalentes.
4. B. Completos.
23 23
34 34
23 67
34 34
23 23
80
A. B. Completos. Este tipo de árboles es aquel en el que sus diferentes
niveles tienen dos hijos (izquierdo y derecho), acepción del último nodo.
34
23 17
12 34 87 22
Inorden
Recorrido del subárbol izquierdo en inorden.
Buscar la raíz.
Recorrido del subárbol derecho en inorden.
Preorden
Examinar la raíz.
Recorrido del subárbol izquierdo en preorden.
Recorrido del subárbol derecho en preorden.
81
Postorden
Recorrido del subárbol izquierdo en postorden.
Recorrido del subárbol derecho en postorden.
Examinar la raíz.
B C
D E F
J
G H I
Inorden: GDBHEIACJKF
Preorden: ABDGEHICFJK
Postorden: GDHIEBKJFCA
Pseudocódigo:
funcion inorden(nodo)
inicio
82
si(existe(nodo))
inicio
inorden(hijo_izquierdo(nodo));
tratar(nodo); //Realiza una operación en nodo
inorden(hijo_derecho(nodo));
fin;
fin;
Otro tipo de árboles binarios que podemos encontrar son los enhebrados,
denominado así porque contiene hebras hacia la derecha o a la izquierda. En la
siguiente figura se ilustra el ejemplo de un árbol enhebrado a la derecha.
B B
B B
83
pilas para el recorrido, el recorrido en orden puede hacerse de manera iterativa,
por lo tanto no se necesita el uso de la recursividad para realizar los recorridos.
ACTIVIDAD DE APRENDIZAJE
1.- Realizar una investigación y entregar resumen, sobre el tema arboles
enhebrados.
84
5.5. ÁRBOLES DE BÚSQUEDA
Los árboles de búsqueda son estructuras de datos que soportan las siguientes
operaciones de conjuntos dinámicos:
Search (Búsqueda).
Minimum (Mínimo).
Maximum (Máximo).
Predecessor (Predecesor).
Insert (Inserción).
Delete (eliminación).
ACTIVIDAD DE APRENDIZAJE
1. Realizar una investigación y entregar un resumen sobre el tema árboles de
búsqueda.
12
Cfr. http://droperspace.blogspot.com/
13
Cfr. http://droperspace.blogspot.com/
85
5.6. PROBLEMAS
A continuación se presentaran ejemplos prácticos sobre el uso de los árboles y
su implementación en los lenguajes de programación.
El siguiente código, muestra la estructura de un árbol, presentando los
datos en los tres momentos PreOrden, InOrden y PostOrden.14
class NodoBinario{
int dato;
NodoBinario Hizq, Hder;
//Constructores
NodoBinario (int Elem){
dato = Elem;
NodoBinario Hizq, Hder = null;
}
//Insercion de un elemento
public void InsertaBinario (int Elem){
if(Elem < dato){
if (Hizq == null)
Hizq = new NodoBinario(Elem);
else
Hizq.InsertaBinario(Elem);
}
else{
if (Elem > dato){
if (Hder == null)
Hder = new NodoBinario (Elem);
else
Hder.InsertaBinario(Elem);
}
}
}
14
Cfr. http://www.scribd.com/doc/14767010/Arbol1
86
}
//Constructor
public Arbol(){
Raiz = null;
}
87
public void PostOrden (NodoBinario Nodo){
if(Nodo == null)
return;
else{
PostOrden (Nodo.Hizq);
PostOrden (Nodo.Hder);
System.out.print (Nodo.dato + " ");
}
}
88
//Altura del arbol
public int Altura (NodoBinario Nodo){
int Altder = (Nodo.Hder == null? 0:1 + Altura (Nodo.Hder));
int Altizq = (Nodo.Hizq == null? 0:1 + Altura (Nodo.Hizq));
return Math.max(Altder,Altizq);
}
89
//Construtor Crea un nodo del tipo Object
NodosListaA (NodoBinario valor){
datos =valor;
siguiente = null; //siguiente con valor de nulo
}
//Constructor
public Cola (String s){
Nombre = s;
PrimerNodo = UltimoNodo =null;
}
90
//Inserta un Elemento al Frente de la Lista
public void InsertaInicio (NodoBinario ElemInser){
if(VaciaLista())
PrimerNodo = UltimoNodo = new NodosListaA (ElemInser);
else
PrimerNodo = new NodosListaA (ElemInser, PrimerNodo);
}
//Eliminar al Inicio
public void EliminaInicio(){
if(VaciaLista())
System.out.println ("No hay elementos");
//Elimina al final
public void EliminaFinal (){
if(VaciaLista())
System.out.println ("No hay elementos");
91
// Restablecer las referencias de PrimerNodo y UltimoNodo
if (PrimerNodo.equals (UltimoNodo))
PrimerNodo = UltimoNodo = null;
else{
NodosListaA Actual =PrimerNodo;
while (Actual.siguiente != UltimoNodo)
Actual = Actual.siguiente;
UltimoNodo =Actual;
Actual.siguiente = null;
}
}
}
class ArbolBinarioA{
public static void main (String[]args){
Arbol A = new Arbol();
A.InsertaNodo (10);
A.InsertaNodo (7);
A.InsertaNodo (8);
A.InsertaNodo (6);
A.InsertaNodo (12);
A.InsertaNodo (11);
A.InsertaNodo (5);
A.InsertaNodo (4);
A.InsertaNodo (3);
A.InsertaNodo (2);
System.out.print("El recorrido en Preorden es: ");
A.Preorden (A.Raiz);
System.out.println();
System.out.print("El recorrido en Inorden es: ");
A.Inorden (A.Raiz);
92
System.out.println();
System.out.print("El recorrido en Postorden es: ");
A.PostOrden (A.Raiz);
System.out.println();
System.out.println("La altura del arbol es: " + A.Altura (A.Raiz));
A.Anchura (A.Raiz);
}
}
import java.io.*;
//crea el arbol
public arbolRojiNegro(){
}
93
public nodoRojiNegro Insertar(int codcu,int codca,String nom,int req,
nodoRojiNegro t,String out){
raiz=t;
try{
outm=out;
if (estaVacio()){
raiz = new nodoRojiNegro(codcu,codca,nom,req);
raiz.color = negro;
FileWriter fw = new FileWriter (outm+".txt", true);
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter salida = new PrintWriter (bw);
salida.println("Elemento: " + codcu);
rota=rota+"Elemento: " +codcu+"\n";
salida.close();
}
else
raiz = insertaraux(codcu,codca,nom,req,t);
}
catch(Exception e){
}
return raiz;
}
94
else
x = x.hDer;
}
nodoRojiNegro z = new
nodoRojiNegro(codcu,codca,nom,req,y);
if (codcu < y.Codcur)
y.hIzq = z;
else
y.hDer = z;
FileWriter fw = new FileWriter (outm+".txt", true);
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter salida = new PrintWriter (bw);
salida.println("Elemento: " + z.Codcur);
salida.close();
rota=rota+"Elemento: " +z.Codcur+"\n";
//inserta en el arbol para arreglarlo
t = insertarArreglado(t, z);
}
catch(Exception e){
}
return t;
}
95
//si el padre es hijo izquierdo de abuelo
if (z.padre == z.padre.padre.hIzq){
nodoRojiNegro y = z.padre.padre.hDer;
//si el tio de z tambien es rojo
if (y!=null && y.color == rojo){
//cambia al tio de z negro, al padre de z
negro
salida.println("Cambio de color");
rota=rota+"Cambio de color\n";
z.padre.color = negro;
y.color = negro;
z.padre.padre.color = rojo;
z = z.padre.padre;
}
else {
//Si z es hijo derecho
if (z.padre.hDer!=null && z ==
z.padre.hDer) {
salida.println("Rotacion
Izquierda");
rota=rota+"Rotacion
Izquierda\n";
z = z.padre;
t = rotarIzq(t, z);
}
else{
salida.println("Rotacion
Derecha");
rota=rota+"Rotacion Derecha\n";
//Caso 3
z.padre.color = negro;
z.padre.padre.color = rojo;
t = rotarDer(t, z.padre.padre);
}
96
}
}
//Si el padre de z es hijo derecho
else{
nodoRojiNegro y = z.padre.padre.hIzq;
//si el tio de z es rojo
if (y!=null && y.color == rojo) {
// cambiar colores
salida.println("Cambio de color");
rota=rota+"Cambio de color\n";
z.padre.color = negro;
y.color = negro;
z.padre.padre.color = rojo;
z = z.padre.padre;
}
else {
//si z es hijo izquierdo
if (z == z.padre.hIzq) {
salida.println("Rotacion Derecha");
rota=rota+"Rotacion Derecha\n";
z = z.padre;
t = rotarDer(t, z);
}
else{
salida.println("Rotacion Izquierda");
rota=rota+"Rotacion Izquierda\n";
//Caso 3
z.padre.color = negro;
z.padre.padre.color = rojo;
t = rotarIzq(t, z.padre.padre);
}
}
}
}
97
salida.close();
}
catch (Exception e){
}
t.color = negro;
return t;
}
//rotacion izquierda
public nodoRojiNegro rotarIzq(nodoRojiNegro t, nodoRojiNegro x) {
nodoRojiNegro y = x.hDer;
x.hDer = y.hIzq;
if (y.hIzq != null)
y.hIzq.padre = x;
y.padre = x.padre;
if (x.padre == null)
t = y;
else if (x == x.padre.hIzq)
x.padre.hIzq = y;
else
x.padre.hDer = y;
y.hIzq = x;
x.padre = y;
return t;
}
//rotacion derecha
public nodoRojiNegro rotarDer(nodoRojiNegro t, nodoRojiNegro x) {
nodoRojiNegro y = x.hIzq;
x.hIzq = y.hDer;
if (y.hDer != null)
y.hDer.padre = x;
y.padre = x.padre;
98
if (x.padre == null)
t = y;
else if (x == x.padre.hIzq)
x.padre.hIzq = y;
else
x.padre.hDer = y;
y.hDer = x;
x.padre = y;
return t;
}
//busca un elemento
public boolean Miembro(int x, nodoRojiNegro r){
raiz=r;
boolean si=false;
nodoRojiNegro temp = raiz;
while (temp != null && si==false) {
if(x==temp.Codcur){
si=true;
}
else{
if (x < temp.Codcur)
temp = temp.hIzq;
else
if(x > temp.Codcur)
temp = temp.hDer;
}
}
return si;
}
99
}
//Imprime en inorden
public void Imprimir(nodoRojiNegro t){
if(estaVacio())
System.out.println("Arbol Vacio");
else
imprimirArbol(t);
}
//auxiliar
public void imprimirArbol(nodoRojiNegro t){
if(t != null){
imprimirArbol(t.hIzq);
if(t.color==1)
System.out.println(t.Codcur + " negro");
else
System.out.println(t.Codcur + " rojo");
imprimirArbol(t.hDer);
}
}
}
100
nodoRojiNegro(){
padre=hIzq=hDer=null;
color=0;
}
nodoRojiNegro (int codcu,int codca,String nom,int req){
Codcur= codcu;
Codcar= codca;
Nombre= nom;
Requisito= req;
padre= hIzq = hDer = null;
color= 0;
}
public nodoRojiNegro(int codcu,int codca,String nom,int req,
nodoRojiNegro pa){
Codcur= codcu;
Codcar= codca;
Nombre= nom;
Requisito= req;
hIzq= hDer=null;
padre= pa;
color= 0;
}
}
class ArbolRojiNegroA{
public static void main(String args[]){
arbolRojiNegro nuevo=new arbolRojiNegro();
nuevo.Insertar(1,1,"pr",1,nuevo.raiz,"pr");
nuevo.Insertar(2,1,"pr",1,nuevo.raiz,"pr");
nuevo.Insertar(20,1,"pr",1,nuevo.raiz,"pr");
nuevo.Insertar(8,1,"pr",1,nuevo.raiz,"pr");
nuevo.Insertar(12,1,"pr",1,nuevo.raiz,"pr");
nuevo.Insertar(4,1,"pr",1,nuevo.raiz,"pr");
nuevo.Insertar(21,1,"pr",1,nuevo.raiz,"pr");
101
nuevo.Insertar(18,1,"pr",1,nuevo.raiz,"pr");
nuevo.Insertar(7,1,"pr",1,nuevo.raiz,"pr");
nuevo.Insertar(52,1,"pr",1,nuevo.raiz,"pr");
nuevo.Insertar(63,1,"pr",1,nuevo.raiz,"pr");
nuevo.Insertar(17,1,"pr",1,nuevo.raiz,"pr");
nuevo.imprimirArbol(nuevo.raiz);
}
}
import javax.swing.*;
import java.io.*;
class ArbolHeap{
// Arreglo en el cual se almacenan los elementos.
int[] llave;
// Posición en la cual se va a insertar.
int posicion;
//Contructor
public ArbolHeap(){
llave = new int[10];
posicion = 0;
}
102
//Obtiene el hijo izquierdo según la posicion del padre
public int hIzq(int posPadre){
return (2 * posPadre);
}
103
ultima = ultima - 1;
padre = 0;
if((ultima >= 2) && (llave[2] > llave[1]))
hijo = 2;
else
hijo = 1;
while((hijo <= ultima) && (llave[hijo] > llaveAnterior)){
llave[padre] = llave[hijo];
padre = hijo;
hijo = padre * 2;
if(((hijo + 1) <= ultima) && (llave[hijo + 1] >
llave[hijo]))
hijo++;
this.mostrar();
}
llave[padre] = llaveAnterior;
this.mostrar();
}
}
//Muestra al arreglo
public void mostrar(){
try{
FileWriter fw = new FileWriter ("ArbolHeap.txt", true);
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter salida = new PrintWriter (bw);
int i = 0;
while( i <= 9){
salida.print(llave[i] +" ");
i++;
}
salida.println("");
salida.println("-------------------------");
104
salida.close();
}
catch(Exception e){
}
}
class ArbolHeapA{
public static void main(String args[]){
ArbolHeap nuevo=new ArbolHeap();
nuevo.inserta(2);
nuevo.inserta(7);
nuevo.inserta(1);
nuevo.inserta(9);
nuevo.inserta(16);
nuevo.inserta(3);
nuevo.inserta(18);
nuevo.inserta(10);
105
nuevo.inserta(11);
nuevo.inserta(22);
System.out.println("Heap: "+nuevo.muestra());
nuevo.HeapSort();
System.out.println("Heap ordenado: "+nuevo.muestra());
}
}
ACTIVIDAD DE APRENDIZAJE
1.- Elaboración de los ejercicios que se encuentran en esta sección, sobre la
creación de árboles en los lenguajes de programación.
106
AUTOEVALUACIÓN
107
10.- Los árboles de grado superior a 2 reciben ( ) Árbol
este nombre.
Respuesta: 5, 9, 8, 10, 3, 7, 4, 2, 6, 1
108
UNIDAD 6
GRAFOS
OBJETIVO
Comprender los conceptos básicos que rodean el uso de los grafos, su
funcionalidad y representación.
TEMARIO
6.1. TERMINOLOGÍA
6.2. CARACTERÍSTICAS GENERALES
6.3. REPRESENTACIÓN DE UN GRAFO
109
MAPA CONCEPTUAL
Grafo
es
es
Conjunto empleado resolver
para
de
los
se
objetos unen problemas
se por
conocen aristas
y
como las
vértices empleando
los
110
INTRODUCCIÓN
111
6.1. TERMINOLOGÍA
Dentro de las matemáticas y el área de ciencias de la computación, un grafo se
puede definir como un conjunto de objetos llamados vértices (o nodos) unidos
por aristas (o arcos), que permiten representar relaciones binarias entre
elementos de un conjunto.
4
6
5
3
1
112
Fig. 6.2. Ejemplo sobre el uso de los grafos
“Camino. Es una secuencia de vértices V1, V2, V3, ... , Vn, tal que cada
uno de estos V1->V2, V2->V3, V1->V3.
Longitud de camino. Es el número de arcos en ese camino.
Camino simple. Es cuando todos sus vértices, excepto tal vez el primero y
el último son distintos.
Ciclo simple. Es un camino simple de longitud por lo menos de uno que
empieza y termina en el mismo vértice.
Aristas paralelas. Es cuando hay más de una arista con un vértice inicial y
uno terminal dados.
Grafo cíclico. Se dice que un grafo es cíclico cuando contiene por lo menos
un ciclo.
Grafo acíclico. Se dice que un grafo es acíclico cuando no contiene ciclos.
Grafo conexo. Un grafo G es conexo, si y sólo si existe un camino simple
en cualesquiera dos nodos de G.
113
Grafo completo o Fuertemente conexo. Un grafo dirigido G es completo si
para cada par de nodos (V,W) existe un camino de V a W y de W a V
(forzosamente tendrán que cumplirse ambas condiciones), es decir que
cada nodo G es adyacente a todos los demás nodos de G.
Grafo unilateralmente conexo. Un grafo G es unilateralmente conexo si
para cada par de nodos (V,W) de G hay un camino de V a W o un camino
de W a V.
Grafo pesado o etiquetado. Un grafo es pesado cuando sus aristas
contienen datos (etiquetas). Una etiqueta puede ser un nombre, costo o un
valor de cualquier tipo de dato. También a este grafo se le denomina red de
actividades, y el número asociado al arco se le denomina factor de peso.
Vértice adyacente. Un nodo o vértice V es adyacente al nodo W si existe un
arco de m a n.
Grado de salida. El grado de salida de un nodo V de un grafo G, es el
número de arcos o aristas que empiezan en V.
Grado de entrada. El grado de entrada de un nodo V de un grafo G, es el
número de aristas que terminan en V.
Nodo fuente. Se le llama así a los nodos que tienen grado de salida
positivo y un grado de entrada nulo.
Nodo sumidero. Se le llama sumidero al nodo que tiene grado de salida
nulo y un grado de entrada positivo.”15
15
Véase http://boards4.melodysoft.com/app?ID=2005AEDII0405&msg=15&DOC=21
114
Representación mediante matrices: La forma más sencilla de guardar la
información de los nodos es mediante la utilización de un vector que indexe los
nodos, de modo que los arcos entre los nodos se pueden ver como relaciones
entre los índices. Esta relación entre índices se puede guardar en una matriz,
que se denomina de adyacencia.”16
“Representación mediante listas: En las listas de adyacencia se guarda
por cada nodo, además de la información que pueda contener el propio nodo,
una lista dinámica con los nodos a los que se puede acceder desde él. La
información de los nodos se puede guardar en un vector, al igual que antes, o
en otra lista dinámica.”17
“Representación mediante matrices dispersas: Para evitar uno de los
problemas que se tienen con las listas de adyacencia, que es la dificultad de
obtener las relaciones inversas, se pueden utilizar las matrices dispersas, que
contienen tanta información como las matrices de adyacencia, pero, en
principio, no ocupan tanta memoria como las matrices, pues al igual que en las
listas de adyacencia, sólo se representan los enlaces que existen en el grafo.
Los grafos se representan en memoria secuencial mediante matrices de
adyacencia. Una matriz de adyacencia, es una de dimensión n*n, en donde n
es el número de vértices que almacena valores booleanos, donde matriz M[i,j]
es verdadero si y sólo si existe un arco que vaya del vértice y al vértice j.”18
Véase el siguiente grafo dirigido con su matriz de adyacencia, que se
obtuvo a partir del grafo
16
Cfr. http://www.scribd.com/doc/39500798/GRAFOS
17
Cfr. http://www.scribd.com/doc/39500798/GRAFOS
18
Cfr. http://www.scribd.com/doc/39500798/GRAFOS
115
Una lista de adyacencia tiene la siguiente definición: Para un vértice i es
una lista en cierto orden formada por todos los vértices adyacentes [a,i]. Se
puede representar un grafo por medio de un arreglo donde cabeza de i es un
apuntador a la lista de adyacencia al vértice i.
Véase el siguiente grafo dirigido con su lista de adyacencia.”19
ACTIVIDAD DE APRENDIZAJE
1.- Desarrolla una aplicación de forma libre (elegida por el alumno), donde
demuestre el uso de los grafos.
19
Cfr. http://www.scribd.com/doc/39500798/GRAFOS
116
AUTOEVALUACIÓN
2.- Es una secuencia de vértices V1, V2, V3, ... , ( ) Ciclo simple
Vn, tal que cada uno de estos V1->V2, V2-
>V3, V1->V3
4.- Es cuando todos sus vértices, excepto tal vez ( ) Aristas paralelas
el primero y el último son distintos.
Respuesta.- 8, 5, 7, 6, 9, 1, 4, 2, 3
117
BIBLIOGRAFÍA
118
GLOSARIO20
20
Creado con información de alguno de los siguientes sitios: http://231mequipo2.blogspot.com/ o
http://nancynohemi.webuda.com/index.php?option=com_content&view=article&id=40&Itemid=41 o
http://hellfredmanson.over-blog.es/article-30369340-6.html
119
Dato Estructurado.- Esta formado por varios componentes, cada uno de los
cuales puede ser a su vez un dato estructurado.
Dato simple.- Aquel que hace referencia a un único valor a la vez y que ocupa
una casilla en memoria.
Estructura dinámica de datos.- Aquella que permite la asignación de espacio en
memoria durante la ejecución de un programa, conforme lo requieren las
variables.
Fifo.- Iníciales en ingles de Firt In, Firt Out, el primero que entra es el primero
en salir.
for.- Permite la construcción de ciclos.
Grado. Es el número de descendientes directos de un determinado nodo.
Grado del árbol es el máximo grado de todos los nodos del árbol.
Gráficas.- Estructura de datos que permite representar diferente tipo de
relaciones entre los objetos.
Grafica completa.- Se dice que una gráfica es completa si cada vértice de v de
G es adyacente a todos los demás vértices de G.
Gráfica conexa.- Se dice que una gráfica es conexa si existe un camino simple
entre dos de sus nodos cualesquiera.
Gráfica dirigida.- Se caracteriza por que sus aristas tienen asociada una
dirección.
Gráficas no dirigidas.- Su característica principal es que sis aristas son pares
no ordenados de vértices.
Hermano. Dos nodos serán hermanos si son descendientes directos de un
mismo nodo.
Hijo.- X es hijo de Y, sí y solo sí el nodo X es apuntado por Y. También se dice
que X es descendiente directo de Y.
Hoja. Se le llama hoja o terminal a aquellos nodos que no tienen ramificaciones
(hijos).
120
Lista.- Colección de elementos llamados nodo, cuyo orden se establece por
medio de punteros.
Lista circular.- Aquella en la que su último elemento apunta al primero.
Lista doblemente ligada.- Colección de elementos llamados nodos, en la cual
cada nodo tiene dos punteros, uno apuntando al nodo sucesor y otro al
predecesor.
Lista invertida.- Lista que contiene las claves de los elementos que posee un
determinado atributo.
Matriz.- Estructura de datos que permite organizar la información en renglones
y columnas.
Métodos de búsqueda.- Se caracteriza por el orden en el cual se expande los
nodos.
Multilista.- Estructura que permite almacenar en una o varias listas, las
direcciones de los elementos que poseen uno o más atributos específicos, la
cual facilita la búsqueda.
Nivel. Es el número de arcos que deben ser recorridos para llegar a un
determinado nodo. Por definición la raíz tiene nivel 1.
Nodo interior. Es un nodo que no es raíz ni terminal.
Notación infija.- Se dice que una expresión aritmética tienen notaciones infijas
cuando sus operadores están entre los operandos, por ejemplo A+B.
Notación postfija.- Se dice que una expresión aritmética tienen notaciones
infijas cuando sus operadores están al final de los operandos, por ejemplo AB+.
Notación prefija.- Se dice que una expresión aritmética tienen notaciones infijas
cuando sus operadores están al inicio de los operandos, por ejemplo +AB.
Ordenación Externa.- En esta forma de ordenación los datos se toman de
archivos residentes en dispositivos de almacenamiento secundarios, tales
como discos, cintas, etc.
Ordenación interna.- Se aplica en la ordenación de arreglos y se realiza con
todos los datos de estos alojados en la memoria principal de la computadora.
Ordenar.- Organizar un conjunto de datos y objetos en una secuencia
especifica, por lo general ascendente o descendente.
Padre. X es padre de Y sí y solo sí el nodo X apunta a Y. También se dice que
X es antecesor de Y.
Peso. Es el número de nodos del árbol sin contar la raíz.
121
Pila.- Lista de elementos a la cual se puede insertar o eliminar elementos sólo
por uno de sus extremos.
public .- Definición de un objeto de tipo público, que puede ser empleado en
cualquier parte del código del programa.
Puntero.- Dato que almacena una dirección de memoria, en donde se
almacena una variable.
Recursión.- Herramienta de programación que permite definir un objeto en
términos de él mismo.
Registro.- Es un dato estructurado en el cual sus componentes pueden ser de
diferentes tipos, incluso registro o arreglos.
String.- Definición de un objeto tipo Cadena.
122