Está en la página 1de 49

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.

PROF.CARPIO.

ESTRUCTURA DE DATOS
1. INTRODUCCIN A LAS ESTRUCTURAS DE DATOS.
1.1 TIPOS DE DATOS ABSTRACTOS (TDA).
Es un tipo de dato definido por el programador que se puede manipular de un modo similar a los
tipos de datos definidos por el lenguaje.
Cando los tipos de datos existentes en el lenguaje no son suficientes o no son eficientes para
ciertas aplicaciones, la mayora de los lenguajes de programacin permiten al usuario definir sus
propios tipos de datos.
Esta definicin consiste en establecer los elementos de que consta el tipo as como las
operaciones que se pueden realizar con instancias de este tipo.
Un TDA es el elemento bsico de la abstraccin de datos. Debe verse como una caja negra, pues
la representacin y la implementacin deben permanecer ocultas, de forma que para trabajar con
los elementos de un TDA el nico mecanismo permitido es el de usar las operaciones definidas
para dicho TDA.

DECLARACIN DE TDAS.
Para construir un tipo abstracto se debe:
1) Establecer la definicin del tipo.
2) Definir tambin las operaciones (clases) que pueden operar con dicho tipo
3) Ocultar la presentacin de los elementos del tipo de modo que slo se puede trabajar con ellos
usando los procedimientos definidos en 2)
4) Poder crear instancias mltiples del tipo.

1.2 MODULARIDAD.
Es la propiedad que permite subdividir una aplicacin en partes ms pequeas
llamadas mdulos, cada una de las cuales debe ser tan independiente como sea
posible de la aplicacin en s y de las restantes partes.
La Modularidad consiste en dividir un programa en mdulos que se puedan compilar
por separado, pero que tienen conexiones con otros mdulos. Al igual que la
encapsulacin, los lenguajes soportan la Modularidad de diversas formas.
La Modularidad es la propiedad de un sistema que permite su descomposicin en un
conjunto de mdulos cohesivos y dbilmente acoplados. Por supuesto no todos los
mdulos son iguales: tomar un programa monoltico y separarlo de forma aleatoria en
archivos no es ptimo. Se debe tener en cuenta los conceptos asociados de
dependencia, acoplamiento, cohesin, interfaz, encapsulacin y abstraccin.
Una vez identificado lo que es un buen mdulo, se puede contemplar la reutilizacin de
un buen mdulo como componente.
El Mdulo A depende del Mdulo B si cualquier cambio en el Mdulo B implica que el
Mdulo A tambin tenga que ser modificado. A veces se dice que el Mdulo A es un
cliente del Mdulo B, o que el Mdulo B acta como servidor del Mdulo A. En general,
es normal que un mismo mdulo sea tanto cliente como servidor. Esto significa, que

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
depende de algunos mdulos, mientras que otros mdulos dependen de l. Incluso es
posible que un par de mdulos se tengan uno al otro de cliente; sin embargo, ste es
un ejemplo de dependencia circular, que debe evitarse cuando sea posible debido a
que impide la reutilizacin.

1.3 USO DE TDA.


La mayora de las aplicaciones de inters de los TDA implican el uso del concepto de apuntadores
(referencia), que no son parte de los alcances de este curso. As, las operaciones y definiciones
que se vern a continuacin son las ms elementales posibles, slo para ejemplificar la definicin y
el uso de un TDA.
Un ejemplo de TDA en Java, es una clase Persona.
Las operaciones que se aplican a un TDA:
1) Construccin: Crean una nueva instancia del tipo
2) Transformacin: Cambian el valor de uno o ms elementos del tipo.
3) Observacin: Permiten determinar el valor de uno o ms elementos de un tipo sin modificarlos
4) Iteradores: Permiten procesar todo los elementos de un TDA en forma secuencial.

1.4 MANEJO DE MEMORIA ESTTICA.


La memoria esttica es la que se reserva al momento de compilacin antes de comenzar a
ejecutarse el programa. Los objetos son creados en ese momento y destruidos al final del
programa. Mantiene la misma de localizacin en memoria durante todo el transcurso del programa.
Los objetos administrados de este modo son:
Variables static.
Variables globales.
Miembros static de la Clase.
Literales de cualquier tipo.
Ejemplos:
int Numeros[ ]= {1,2,3,4,5};
El inconveniente de utilizar memoria esttica es que la cantidad de memoria se reserva antes de
conocer los datos completos del problema lo que a veces lleva a reservar un mximo de memoria
que en la mayora de las veces no se va a necesitar, y la ventaja es ms fcil su implementacin.

1.5 MANEJO DE MEMORIA DINMICA.


Las variables dinmicas son aquellas que crecen de tamao o se reducen durante la ejecucin de
un programa.
Estas se almacenan en un espacio de memoria llamado heap. El heap se localiza en la regin de
memoria que esta encima del stack. Algunos lenguajes de programacin permiten que el
programador asigne y desasigne manualmente la memoria. Java utiliza un recolector de basura.
Para usar el heap un programa requiere:

Una o ms variables que refieran el lugar donde se encuentran las variables dinmicas.
Un mtodo para obtener memoria (new)

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
Una forma de asignar la direccin de memoria a alguna variable (identificador)
Una forma para referirse a la variable dinmica.
Liberacin de memoria:
La memoria esttica se libera cuando el programa finaliza su ejecucin.
La memoria dinmica se libera de dos formas:
Explicita. El programador decide cuando un elemento debe ser eliminado de la memoria. El LP
provee mecanismos para liberacin de memoria.
Implcita. El sistema decide que elementos deben ser eliminados para recuperar el espacio de
memoria que ocupan. El sistema cuenta con un recolector de basura.
The Garbage Collector:
Algunos lenguajes de programacin requieren que el programador mantenga la informacin de
todos los objetos creados en un programa para que estos puedan ser destruidos cuando ya no son
requeridos en la ejecucin.
Este mtodo para manejar la memoria puede resultar tedioso y propicio a errores.
Java permite la creacin de tantos objetos como sean necesarios sin tener que destruirlos
explcitamente cuando ya no son requeridos.
El medio ambiente de ejecucin de Java cuenta con un mecanismo llamado recolector de basura
(Garbage Collector) que se encarga de eliminar los objetos cuando ya no existen referencias a
ellos.
El recolector de basura, de manera automtica, se ejecuta peridicamente durante la ejecucin de
un programa.

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

2. RECURSIVIDAD.
2.1 DEFINICIN: ES CUANDO UN OBJETO ESTA FORMADO POR SI MISMO O SE DEFINE
EN FUNCIN DE S MISMO.

2.2 Procedimientos recursivos:


CARACTERISTICAS:
SE LLAMA A SI MISMO.
DEBE TENER UNA CONDICIN DE PARO.
EN CADA LLAMADO DEBE ACERCARSE AL RESULTADO ESPERADO.
.
DEFINICIN DE LA EXPRESIN RECURSIVA EN TRMINOS RECURSIVOS.

VENTAJAS:

Cdigo compacto (ms pequeo que el iterativo).


Ms rpido.
Se utiliza para Lenguajes de Programacin que no tienen ciclos (Por ejemplo LISP).
Aprovechamiento de la memoria para utilizar la recursin.

2.3 Ejemplos de casos recursivos:


1. HACER UNA FUNCION RECURSIVA QUE CALCULE EL FACTORIAL DE UN NUMERO
POSITIVO.
a)
0! = 1
b)
n>0: n! = n * (n-1)!
Por ejemplo factorial de 6!= 1*2*3*4*5*6 = 720
2. HACER UNA FUNCION RECURSIVA QUE ELEVE UN NUMERO A UN EXPONENTE.
a)
b)

B^0 =1
B^E, E>0: ELEVA=ELEVA(B,E-1)*B

Por ejemplo 2^3 =2*2*2 =8


3.

HACER UNA FUNCION RECURSIVA QUE ENCUENTRE EL NUMERO FIBONACCI DE UN


NUMERO. LOS NUMEROS FIBONACCI SON UNA SUCESION DE NUMEROS. LOS DOS
PRIMEROS NUMEROS POSITIVOS SON 1. DE AH EN ADELANTE, CADA NUMERO
FIBONACCI ES LA SUMA DE LOS DOS ANTERIORES. Por ejemplo:

Numero

10

11

Fibonacci

13

21

34

55

89

Fib(n) para esto existe las siguientes ecuaciones:


Fib(1) =1
Fib(2)=2
Fibn=Fib(n-2)+Fib(n-1)

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

class Ejemplos {
public static void main(String[] args) {
System.out.println("Factorial de 4!="+Factorial(4)); Factorial de 4!= 24
System.out.println("2e3="+eleva(2,3)); 2e3=8
System.out.println("Fibonacci de 7="+Fib(7)); Fibonacci de 7=13
}
public static int Factorial(int n){
if(n==0) return 1;
else
return n*Factorial(n-1);
}
public static int eleva(int b, int e){
if(e==0) return 1;
else
return eleva(b,e-1)*b;
}
public static int Fib(int n){
if((n==1)|| (n==2)) return 1;
else
return Fib(n-2) + Fib(n-1);
}
}

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

4. ESTRUCTURAS LINEALES.
3.1 Listas.
Definicin: Son bloques de informacin organizado bajo un criterio de ordenamiento; es decir la
informacin en las listas esta ordenada.
Se puede insertar en cualquier parte de la lista, as como eliminar cualquier elemento.
La figura 3-A. Muestra una lista de compras; dicha lista contiene un primer elemento, un segundo
elemento y un ltimo. Frecuentemente borramos o aadimos elementos. En la figura 3-B muestra
la lista de compras despus de insertar 3 elementos al final de la misma y borrar otros dos de ella.
miel
aceite
sal
tomates
manzanas
naranjas
huevos
Figura 3-A

miel
aceite
tomates
manzanas
huevos
arroz
pepinos
peras
Figura 3-B

3.1.1 Operaciones bsicas con listas.


La implementacin del TDA Lista requiere, en primer lugar, declarar la clase Nodo, en la que se
combinarn sus dos partes: el dato (entero, flotante, doble, carcter o referencia a objetos) y un
enlace (next). Adems, la clase Lista con las operaciones y el atributo con la cabeza de la lista. Las
operaciones tendrn las siguientes funciones:
Inicializacin o creacin.
Insertar elementos en la lista.
Eliminar elementos en la lista.
Buscar elementos en la lista.
Recorrer la lista enlazada.
Comprobar si la lista est vaca.

3.1.2 Tipos de listas.


El procesamiento de datos implica con frecuencia el almacenamiento y manipulacin de datos
organizados en listas. Una de las formas de almacenarlas es mediante arreglos. Otra forma de
almacenar listas en memoria es aadir a cada dato un nuevo campo, llamado campo enlace o
puntero que contiene la direccin que ocupa el siguiente elemento de la lista. De esta forma los
elementos consecutivos en la lista no necesitan ocupar posiciones consecutivas en memoria. Esto
puede permitir aadir y borrar con facilidad los elementos de la lista.

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

3.1.3 Listas Simplemente Enlazadas.


Es una coleccin lineal de elementos, llamados nodos, donde el orden de los mismos se establece
mediante punteros. Cada no se divide en dos partes: una primera que contiene la informacin
asociada al elemento, y una segunda parte, llamada campo de enlace, que contiene la direccin
del siguiente nodo de la lista.
Representacin de un Nodo:

Nodo
siguient
e
Figura 3.C Lista enlazada (representacin grfica tpica).

e1

e2

e3

en

Figura 3.D Representacin grfica de una lista enlazada.

cabeza
dato

sig
dato sig
Inf
or
ma
3.1.3.1
ci Declaracin de un Nodo.
n

actual
dato

sig

cola
dato

sig

Una lista enlazada se compone de una serie de nodos enlazados mediante referencias. En Java se
declara una clase para contener las dos partes del nodo: dato y enlace. Por ejemplo, para una lista
enlazada de nmeros enteros, la clase Nodo es:
public class Nodo {
int dato;
Nodo enlace;
public Nodo(int t) {
dato=t;
enlace=null;

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
}
}

3.1.3.2 Acceso a la lista: cabecera y cola.


Cuando se construye y se utiliza una lista enlazada en una aplicacin, el acceso a la lista se hace
mediante uno o ms referencias a los nodos. Normalmente, se accede a partir del primer nodo de
la lista, llamado cabeza o cabecera de la lista. Una referencia al primer nodo se llama referencia
cabeza. En ocasiones, se mantiene tambin una referencia al ltimo nodo de la lista enlazada. El
ltimo nodo es la cola de la lista, y una referencia al ltimo nodo es la referencia cola.
Figura 3.E. Lista enlazada con cabecera y cola.

cola

cabeza
4.15

sig

5.25

sig

71.5

sig

10.5

sig

Cada referencia a un nodo debe ser declarada como una variable referencia. Por ejemplo, si se
mantiene una lista enlazada con una referencia de cabecera y otra cola, se deben declarar dos
variables referencias:
Nodo cabeza;
Nodo cola;
En la figura 3.F muestra una lista a la que accede con la referencia cabeza; cada nodo esa
enlazado con el siguiente nodo. El ltimo nodo, cola o final de la lista, no se enlaza con otro nodo,
por lo que su campo enlace contiene la referencia nulo, null. La palabra null representa la
referencia nulo, que es una constante especial de Java. Se puede utilizar null para cualquier valor
de referencia que no apunte a objeto alguno. La referencia null se utiliza, normalmente, en dos
situaciones:
En el campo enlace del ltimo nodo (final o cola) de una lista enlazada.
Como valor de referencia cabeza para una lista enlazada que no tiene nodos. Tal lista se denomina
lista vaca (cabeza=null).
La referencia null se puede asignar a una variable referencia con una sentencia de asignacin
ordinaria. Por ejemplo:
Nodo cabeza;
cabeza=null;

cabeza
4.15

5.25

71.5

10.5

null

Figura 3.F. Referencia null

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

3.1.3.3 Construccin de una lista.


La creacin de una lista enlazada se define la clase Nodo y ListaDin.
La clase ListaDin define el atributo cabeza, referencia a Nodo, para acceder a los elementos de la
lista. Normalmente no es necesario definir el atributo cola. El constructor de ListaDin inicializa
cabeza a null (lista vaca).
Los mtodos de la clase ListaDin implementa las operaciones de una lista enlazada: add (Insertar
un elemento en la Lista), remove (Elimina un elemento en la lista), bsquedaAdems
InsertaPrimero (Inserta un elemento en primer nodo de la lista), InsertaUltimo (Inserta un elemento
entre dos elementos de la lista o Inserta un elemento al final de la lista), Consultas (Muestra el
contenido de todos los elementos de la lista).

3.1.3.4 Insercin de un elemento en una lista.


El nuevo elemento que se desea incorporar a una lista se puede insertar de distintas formas, segn
la posicin o punto de insercin:

En la cabeza de la lista (elemento primero).


En el final de la lista (elemento ltimo).
Antes de un elemento especificado.
Despus de un elemento especificado.

3.1.3.4.1 Insertar un nuevo elemento en la cabeza de la lista.


La posicin ms fcil y, a la vez, ms eficiente en donde insertar un nuevo elemento de una lista es
en la cabeza, es decir, por el primer nodo de la lista. El proceso de insercin se resume en este
algoritmo:
public class Nodo {
int dato;
Nodo enlace;
public Nodo(int t) {
dato=t;
enlace=null;
}
}
public void InsertaPrimero(int N) {
Nodo nuevo=new Nodo(N);
nuevo.enlace=cabeza;
cabeza=nuevo;
}

Crear un nodo e inicializar el campo dato al nuevo elemento. La referencia del nodo
creado se asigna a nuevo variable local del mtodo.
Hacer el campo enlace del nuevo nodo apunte a la cabeza (primero) de la lista original.
Hacer que la cabeza apunte al nodo que se ha creado.

El ejemplo 3.1 Inserta un elemento por la cabeza de una lista siguiendo los pasos del algoritmo. A
continuacin, se escribe el cdigo Java, del mtodo InsertaPrimero.

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

public void InsertaPrimero(int N) {


Nodo nuevo=new Nodo(N);
nuevo.enlace=cabeza;
cabeza=nuevo;
}

Ejemplo 3.1
Una lista enlazada que contiene tres elementos, 10,25 y 40. Insertar un nuevo
elemento, 4, en cabeza de la lista.

cabeza
10

25

40

null

40

null

Paso 1
Cdigo Java
Nodo nuevo=new Nodo(N);

nuevo
4

cabeza
10

25

Paso 2
El campo enlace del nuevo nodo apunta al nodo cabeza actual de la lista.

Cdigo Java
nuevo.enlace=cabeza;

nuevo
4

cabeza
10

25

40

null
10

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Paso 3
Se cambia la referencia de cabeza para que apunte al nodo creado; es decir; cabeza apunta al
mismo nodo al que apunta nuevo.
Cdigo Java
cabeza=nuevo;

nuevocabeza
4

10

40

25

null

En este momento, el mtodo de InsertarPrimero termina su ejecucin, la variable local nuevo


desaparece y slo permanece la referencia al primer nodo de la lista: cabeza

cabeza
4

10

40

25

null

Caso particular.
El mtodo InsertaPrimero tambin acta correctamente si se trata de aadir un primer nodo o
elemento a una lista vaca. En este caso, cabeza apunta a null y termina apuntando al nuevo nodo
de la lista enlazada.

3.1.3.4.2 Insertar al final de la lista.


La insercin al final de la lista es menos eficiente debido a que, normalmente, no se tiene un
apuntador al ltimo nodo y, entonces, se recorre desde la cabeza de la lista hasta el ltimo nodo
para realizar la insercin.
Ejemplo: Insertar el elemento 50 en la siguiente lista, L.add(50);

N=50

Mtodo para insertar un elemento add

10

40

null
11

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Nodo R=cabeza,M=null;

M cabezaR

10

null

40

Recorrer la listas
while(R!=null && R.dato<N){
M=R;
R=R.enlace;
}
R!=null && R.4<50 es verdadero (true)

cabezaM
4

R
10

40

null

R!=null && R.10<50 es verdadero (true)

cabeza
4

M
10

R
40

null

R!=null && R.40<50 es verdadero (true)

cabeza
4

M
10

40

null

R!=null && R<50 es falso (false)


12

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

if(R!=null) // es falso
if(R.dato!=N) R=null;
if(R==null){ // es verdadero
if(M==null) // es falso
InsertaPrimero(N);
else // se inserta al final de lista
InsertaUltimo(M,N);
public void InsertaUltimo(Nodo M, int N) {
Nodo nuevo=new Nodo(N);
nuevo.enlace=M.enlace;
}

nuevo
50

null

M.enlace=nuevo;

cabeza
4

M
10

40

nuevo
50

null

Al finalizar el mtodo InsertaUltimo, el nodo nuevo deja de existir.


Al finalizar el mtodo add, el nodo M y R dejan de existir y la lista quedara de la
siguiente forma:

cabeza
4

10

40

50

null

13

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

3.1.3.4.3 Insertar entre dos nodos de la lista.


La insercin de un nuevo nodo puede hacerse entre dos nodos cualesquiera de la lista. Por
ejemplo, en la lista de la siguiente figura, se quiere insertar el elemento 10 entre los nodos datos 8
y 12. Se instancia el mtodo L.add(10); N=10

cabeza
6

12

null

El algoritmo para la operacin insertar entre dos nodos es el mismo para insertar
un nodo al final de la lista. Se recorre los apuntadores auxiliares M y R, la lista
quedara de la siguiente forma.

cabeza
6

M
8

R
12

null

R!=null && R.12<10 es falso (false)


if(R!=null) // es falso
if(R.dato!=N) R=null;
if(R==null){ // es verdadero
if(M==null) // es falso
InsertaPrimero(N);
else // se inserta al final de lista
InsertaUltimo(M,N);
public void InsertaUltimo(Nodo M, int N) {
Nodo nuevo=new Nodo(N);

14

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

nuevo.enlace=M.enlace;

cabeza
6

R
12

null

nuevo
10

M.enlace=nuevo;

cabeza
6

R
12

null

nuevo
10

15

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Al finalizar el mtodo InsertaUltimo, el nodo nuevo deja de existir.


Al finalizar el mtodo add, el nodo M y R dejan de existir y la lista quedara de la
siguiente forma:

cabeza
8

12

10

null

3.1.3.5 Eliminacin de un nodo de una lista.

La operacin de eliminar un nodo de una lista enlazada, se enlaza en nodo anterior con el nodo
siguiente al que se desea eliminar y liberar la memoria que ocupa. El algoritmo para eliminar un
nodo que contiene un dato sigue los siguientes pasos:
1. Buscar el nodo que contiene el dato.
2. Si se encuentra el nodo puede existir tres casos: eliminar el primer nodo, eliminar entre
nodos y eliminar el ltimo nodo.
Tambin considerar el caso de que no existe el nodo en la lista. A continuacin se muestran
ejemplos con los diferentes casos.

Ejemplo1: Eliminar el primer elemento 6 en la siguiente lista, L.remove(n); N=6


Mtodo para Eliminar un elemento remove

cabeza
6

10

12

null

10

12

null

Nodo R=cabeza,M=null;

cabeza
R
6

16

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

if(R!=null){// se comprueba si la lista no esta vacia ----true


if(R.dato==N)//se comprueba si es el primer nodo ----true
cabeza=R.enlace;
El apuntador cabeza apunta al siguiente nodo.

R
6

cabeza
8

12

10

null

y el apuntador R es una variable local y al terminar este mtodo se elimina esta


variable. La lista quedara de la siguiente forma:

cabeza
8

12

10

null

Ejemplo2: Eliminar ltimo elemento 12 en la siguiente lista, L.remove(n); N=12

while(R!=null && R.dato<N){


M=R;
R=R.enlace;
}
R!=null && R.12<12= true && false= false
Al recorrer la lista los apuntadores M y R quedan de la siguiente forma:

cabeza
8

M
10

R
12

null

if(M.enlace!=null) true
M.enlace=R.enlace;

17

cabeza
ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.
PROF.CARPIO.
8
10
null

El apuntador M.enlace a punta a null y de esta manera deja al apuntador R sin


referencia y el Recolector de Basura de Java lo elimina.

cabeza
8

M
10

null

12

null

Al terminar el mtodo remove se eliminan los apuntadores R y M, ya que son


variables locales a este mtodo. Y la lista queda de la siguiente forma:

Ejemplo3: Eliminar elemento 10 en la siguiente lista, L.remove(n); N=10

cabeza
6

10

12

null

Recorrer la lista:
while(R!=null && R.dato<N){
M=R;
R=R.enlace;
}
R!=null && R.10<10= true && false= false
Al recorrer la lista los apuntadores M y R quedan de la siguiente forma:

cabeza
6

10

12

null
18

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

if(M.enlace!=null) true
M.enlace=R.enlace;
El apuntador M.enlace a punta a null y de esta manera deja al apuntador R sin
referencia y el Recolector de Basura de Java lo elimina.

cabeza
6

M
8

12

10

null

Al terminar el mtodo remove se eliminan los apuntadores R y M, ya que son


variables locales a este mtodo. Y la lista queda de la siguiente forma:

cabeza
6

12

null

Ejemplo4: Eliminar un elemento que no existe en la lista 48, considerar la siguiente


lista, L.remove(n); N=48

cabeza
8

12

null

Recorrer la lista:
while(R!=null && R.dato<N){
M=R;
R=R.enlace;
}
R!=null && R.12<48= false && false= false
19

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Al recorrer la lista los apuntadores M y R quedan de la siguiente forma:

cabeza
6

M
8

12

R
null

if(M.enlace!=null) false
M.enlace=R.enlace;
El apuntador M.enlace a punta a null, entonces no es diferente a null, la prueba es
falsa y de esta manera la lista no se modifica. Al terminar el mtodo remove las
variables M y R se eliminan.
3.1.4 Listas doblemente enlazadas.
Aunque la lista ligada simple es una estructura de datos muy til, sin embargo tiene algunas
desventajas. En los siguientes puntos presentaremos otros mtodos para organizar una lista y se
demostrara cmo se pueden utilizar para contrarrestar estas desventajas.
Aun cuando una lista circular encadena tiene ventajas sobre una lista simple, sta todava tiene
algunas deficiencias, uno no puede atravesar esta listan en direccin contraria.
En una lista doblemente ligada cada nodo tiene dos apuntadores, uno para el predecesor y el otro
para su sucesor. Las listas doblemente ligadas pueden ser circulares o simples. Ver figura 3.1.4.A.
Figura 3.1.4.A. REPRESENTACION GRAFICA DE UNA LISTA DOBLEMENTE ENLAZADA.

Podemos considerar los nodos en una lista doblemente enlazada conformada por tres campos: un
campo INFO que contiene la informacin almacenada en el nodo, y los campos izquierdo y
derecho que contienen los apuntadores hacia los nodos de ambos lados.
Los algoritmos de insertar y eliminar son diferentes a las listas anteriores ya que cada nodo tiene
dos apuntadores y en este tipo de lista el criterio de insertar y eliminar puede ser en cualquier parte
de la lista sin considerar que la lista quede ordenada.

20

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

3.1.5 Listas circulares.


Una de las desventajas de las listas ligadas simples es que dado un apuntador P a un nodo de
dicha lista no se puede alcanzar cualquier otro nodo que preceda al nodo P. Si se recorre una lista,
el apuntador original al comienzo de la lista debe ser guardado con el fin de que sea posible hacer
referencia a esta lista de nuevo.
Suponga que se hace un pequeo cambio en la estructura de una lista simple de tal manera que el
campo siguiente en el ltimo nodo contiene un apuntador que va al primer nodo en lugar de ser el
apuntador nulo. Ver figura 5.2.A.

Figura 3.1.5.A. REPRESENTATACION GRAFICA DE UNA LISTA ENLAZADA


CIRCULAR.

Desde cualquier punto en esta lista es posible alcanzar o llegar a cualquier otro punto de ella. Si
empezamos en un sitio dado y recorremos toda la lista al final terminamos en el punto de la
partida. Es importante establecer un apuntador primero y ltimo de la lista. Tambin se establece
que el apuntador nulo representa una Lista Circular vaca:
Operaciones bsicas en lista circular:
Insert(elemento, lista);
Elimina(elemento,lista);
Estos algoritmos son diferentes a los de las listas ligadas simples, ya que se necesita insertar un
nodo que sigue al ltimo nodo de una lista circular, no es posible con los algoritmos anteriores. Una
alternativa es escribir algoritmos separados para estos casos como inserta_final y elimina_tlimo.
Estos algoritmos no se analizarn en este curso.
Consideremos un problema que puede ser resuelto en una forma distinta mediante listas circulares.
El problema se conoce con el nombre de Jos y consiste en un grupo de soldados rodeados por
una gran fuerza enemiga. No hay esperanza de victoria si no llegan refuerzos, y existe solamente
un solo caballo disponible para el escape. Los soldados se ponen de acuerdo en un pacto para
determinar cul de ellos debe de escapar y de solicitar ayuda.

21

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
Forman un crculo y se escoge un nmero n al azar de un sombrero, igualmente se escoge el
nombre de un soldado. Comenzando con el soldado cuyo nombre se ha seleccionado, comienzan
a contar en direccin del reloj alrededor del crculo.
Cuando la cuenta alcance un valor de n, ste soldado es retirado del circulo y empieza de nuevo,
con el siguiente nombre. El proceso contina de tal manera que cada vez que la cuenta alcanza el
valor de n, se remueve un nombre del crculo.
El ltimo soldado que queda es el que debe coger el caballo y escapar. El problema es, dado un
nmero n, el ordenamiento de los hombres en el crculo y el hombre a partir del cual se empieza a
contar, determinar el orden el cual los hombres son eliminados del crculo y cul hombre puede
escapar.
La entrada del programa es el nmero n y una lista de nombres es el ordenamiento en el sentido
de las manecillas del reloj de los hombres en el crculo, comenzamos con el hombre a partir del
cual se debe comenzar a contar. El programa debe imprimir los nombres de los hombres en el
orden que han de ser eliminados y el nombre de la persona que escapa.
Por ejemplo: Asumamos que n=3 y que hay cinco hombres denominados A,B,C,D y E. Contamos
tres hombres, partiendo de A, de tal manera que C es eliminado primero.
Luego empezaremos con D y contamos D, E y regresamos a A, de tal manera que A es eliminado
luego. Despus contamos B,D y E y finalmente B,D y B de tal manera que D es el hombre que
escapa.
Obviamente una lista circular en el cual cada nodo representa un hombre, es una estructura de
datos natural que se presenta para resolver el problema.
Es posible de esta forma alcanzar cualquier nodo a partir de cualquier otro contando alrededor del
crculo. Para representar la remocin de un hombre del crculo, su nodo es eliminado de la lista
circular.
Finalmente, cuando solamente queda un nodo en la lista, se ha llegado al resultado.

3.1.6 Aplicaciones.

Editores grficos
Editores en lnea
Macro ensambladores
Hojas de clculo electrnicas
Dispersin abierta (hashing)
Clasificacin y bsqueda de datos

22

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Implementacin del DTA con Objetos de Lista Simplemente Ligada


(Ordenada de menor a mayor, tipo de dato entero) en Java.

public class Nodo {


int dato;
Nodo enlace;
public Nodo(int t) {
dato=t;
enlace=null;
}

}
import java.util.Scanner;
public class ListaDin {
Scanner leer=new Scanner(System.in);
private Nodo cabeza;
public ListaDin(){
cabeza=null;
}
public void add(int N) {
Nodo R=cabeza,M=null;
char pausa;
while(R!=null && R.dato<N){
M=R;
R=R.enlace;
}
if(R!=null)
if(R.dato!=N) R=null;
if(R==null){
if(M==null) // se inserta al principio de la lista
InsertaPrimero(N);
else // se inserta al final de lista
InsertaUltimo(M,N);
}
else{
System.out.println("Ya existe el dato "+N);
pausa=leer.next().charAt(0);
}
}
public void remove(int N){
Nodo aux=cabeza;
char pausa;
if(aux!=null){
if(aux.dato==N)//se comprueba si es el primer nodo
cabeza=aux.enlace; // el primer nodo es el segundo
else{
while(aux.enlace!=null && aux.enlace.dato!=N)//Busca el elemento o encuentra el fin
de la lista

23

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
aux=aux.enlace;
if(aux.enlace!=null) // Se salta al siguiente
aux.enlace=aux.enlace.enlace;
else{
System.out.println("Error.No existe el dato "+N);
pausa=leer.next().charAt(0);
}
}
}
else{
System.out.println("Error. La lista esta vacia");
pausa=leer.next().charAt(0);
}
}
public void InsertaPrimero(int N) {
Nodo nuevo=new Nodo(N);
nuevo.enlace=cabeza;
cabeza=nuevo;
}
public void InsertaUltimo(Nodo M, int N) {
Nodo nuevo=new Nodo(N);
nuevo.enlace=M.enlace;
M.enlace=nuevo;
}
public void Consultas(){
Nodo aux=cabeza;
char pausa;
System.out.println("CONSULTAS");
while(aux!=null){
System.out.print(aux.dato+"->");
aux=aux.enlace;
}
pausa=leer.next().charAt(0);
}
}
import java.util.Scanner;
public class TestLista {
public static void main(String[] args) {
Scanner leer= new Scanner(System.in);
char op,pausa;
int n,m,i;
ListaDin L= new ListaDin();
do{
Menu();
op=leer.next().charAt(0);
switch(op){
case 'I': case 'i':
System.out.println("MENU INSERTAR");
System.out.print("Dar numero: ");n=leer.nextInt();
L.add(n);
L.Consultas(); break;
case 'E': case 'e':

24

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
System.out.println("MENU ELIMINAR");
System.out.print("Dar numero: ");n=leer.nextInt();
L.remove(n);
L.Consultas(); break;
}
}while(op!='S'&& op!='s');
}
public static void Menu(){
System.out.println("MENU LISTA");
System.out.println("Insertar");
System.out.println("Eliminar");
System.out.println("Salir");
}
}

3.2 Pilas.
DEFINICION.
Una pila es una coleccin ordenada de elementos la cual tiene un extremo por donde se pueden
insertar nuevos elementos y por ese mismo extremo se pueden eliminar. Ese extremo de la pila es
llamado parte superior de la pila o Top de la pila.
Una pila es un contenedor de datos cuyo comportamiento est regido por el principio LIFO (Last
Input Firt Output).

3.2.1 Representacin en Memoria Esttica y Memoria Dinmica.

Representacin en Memoria Esttica con arreglos.

Tope
B

25
X

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Representacin en Memoria Dinmica.

Estructuras de datos Estticas.


Son aquellas que se implementan usando vectores por lo que tienen un nmero de elementos
limitado.
En este tipo de estructura los datos o elementos pueden insertarse y suprimirse elementos solo por
un extremo, llamado tope o cima; es decir, en una pila el ltimo dato en entrar es el primero en
salir.

3.2.2 Operaciones bsicas con Pilas (Stacks):

Pila vaca y llena.

El tope de la pila.

26

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Push & Pop

Las operaciones bsicas de la pila son: insertar un elemento (push) y quitar un


elemento (pop).
PUSH: Cuando se ejecuta la instruccin Push en una Pila, se ejecuta un algoritmo que
inserta un elemento dentro de la pila de datos. Suponga que queremos insertar el
numero 5 en una pila de nmeros:

POP: Cuando se ejecuta la instruccin Pop en una pila se esta indicando que
queremos borrar el elemento que se encuentre en la cima de nuestra pila:

27

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

3.2.3 Aplicaciones de las Pilas.


Los navegadores de Internet almacenan las direcciones visitadas recientemente. Cada vez
que el usuario visita una pgina, su direccin es almacenada en una pila, de forma que
cada vez que el usuario hace click en back se retira el ltimo elemento insertado en la pila,
esto es, se muestra en pantalla la ltima pgina visitada.
Recursin.
Memoria de la computadora (STACK), evaluacin de expresiones aritmticas, notacin
Polaca.
EJEMPLO: Checar si una expresin es correcta en cuanto a parntesis ((X+Y)+(Z+F))*(M+B).
Una posible solucin a este problema es: Tener un contador que aumente para cada parntesis
izquierdo ( y disminuya por cada parntesis derecho ). Ser correcta la expresin si el contador al
final es cero y nunca tomo valores negativos.
Pero supongamos que utilizamos tres smbolos de asociacin: [ ],{},( ) Cmo podemos checar si
una expresin es correcta en cuanto a estos 3 smbolos de asociacin?
No podemos hacerlo por contadores porque debemos abrir con [,{,( pero podemos cerrarlos en otro
orden:
1.

{(X+Y) * [(a+b) * {c+d} (e+f)+a]}+{a+b}

2.

[{(A+B)}]

LA SOLUCION A ESTE PROBLEMA


Almacenar (PUSH) en una pila los smbolos izquierdos y cuando se identifique un smbolo de
asociacin derecho equivalente al izquierdo. Entonces se saca (POP) de la Pila el smbolo
izquierdo correspondiente y as sucesivamente hasta terminar de analizar la expresin. Si al
terminar, la PILA est vaca entonces la expresin es correcta, en caso contrario la expresin es
incorrecta
Operaciones Auxiliares:

28

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

llena():Regresa verdadero si la pila est llena.


vacia():Regresa verdadero si la pila est vaca.
size(): Regresa el tope de la pila.
vaciar(): Elimina todos los elementos de la pila

Implementacin del DTA Esttico Pila en Java.


import java.util.Scanner;
class Pila {
private int[]pila;
private int tope;
private int max;
public Pila() {
max=3;
pila=new int[max];
tope=-1;
}
public void Push(int dato){
if(tope==max-1)
System.out.println("Error: Pila llena...");
else
pila[++tope]=dato;
}
public int Pop(){
int x=-1;
if(tope<0)
System.out.println("Error. Pila Vacia");
else
x=pila[tope--];
return x;
}
public int Stack_Top(){
int x=-1;
if(tope<0)
System.out.println("Error. Pila vacia");
else
x=pila[tope];
return x;
}
public void Stack_Look(){
Scanner leer=new Scanner(System.in);
char continuar;
System.out.println();
System.out.println("Estado Actual de la Pila");
for(int i=tope; i>=0;i--)
System.out.println("["+i+"]= "+pila[i]);
continuar=leer.next().charAt(0);
System.out.println();
}
}

29

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
import java.util.Scanner;
public class PruebaPila {
public static void main(String[] args) {
Scanner leer=new Scanner(System.in);
Pila p1= new Pila();
int elementos=0, dato=0;
char op,continuar;
do{
Menu();
op=leer.next().charAt(0);
switch(op){
case 'P':
case 'p':
System.out.println();
System.out.println("INSERTAR");
System.out.print("Dar numero: ");
dato=leer.nextInt();
p1.Push(dato);
p1.Stack_Look();
break;
case 'Q':
case 'q':
System.out.println();
System.out.println("ELIMINAR");
dato=p1.Pop();
// si dato es -1 pila vacia
System.out.println("Elemento "+dato);
p1.Stack_Look();
break;
case 'V':
case 'v':
System.out.println();
System.out.println("VER");
dato=p1.Stack_Top();
System.out.print("Elemento "+dato);
p1.Stack_Look();
break;
}
}while(op!='F' && op!='f');
}
public static void Menu(){
System.out.println("MENU PILA");
System.out.println("PONER");
System.out.println("QUITAR");
System.out.println("VER");
System.out.print("FIN: ");
}
}.

3.2.4 Notacin infija y postfija.


La notacin polaca (infija), que debe su nombre al matemtico polaco Jan Lukasiewicz, se refiere a
la notacin en la que el smbolo operador se coloca delante de sus operandos. Por ejemplo:
La expresin1: 2+3 seria + 2 3

30

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
La expresin2: 4*5 seria * 4 5
La expresin3: 6-7 sera - 6 7 y por ltimo
La expresin4: 8/2 sera / 8 2.
Ejemplo la expresin (1+6) * (5-3) = / + 1 6 - 5 3 = / 7 - 5 3= / 7 2 = 3
La propiedad fundamental de la notacin polaca es que el orden en que se van a realizar las
operaciones est completamente determinado por las posiciones de los operadores y los
operandos en la expresin. As nunca se necesitan parntesis al escribir expresiones en notacin
polaca.
La notacin polaca inversa (postfija) se refiere a la notacin en la que el operador tras de sus dos
operandos: 2 3 +, 4 5 *, 6 7 -, 8 2 /
La computadora normalmente evala una expresin aritmtica escrita en notacin infija mediante
dos pasos: Primero la convierte a la notacin postfija y luego evala la expresin postfija.

3.3 Colas.
DEFINICION:
Una Cola es una coleccin ordenada de elementos a partir de la cual se pueden insertar elementos
por un extremo llamado la parte POSTERIOR de la Cola y por otro extremo, llamado el FRENTE
de la Cola, se pueden eliminar elementos.

La caracterstica ms importante de una Cola es que es una estructura tipo FIFO: Primero en
entrar primero en salir (First In First Out).

Una cola es simplemente un lugar para almacenar cosas, donde esas cosas se
insertan una detrs de otra y para extraer siempre se lo hace por adelante de la
cola donde se encuentra el primer elemento. Una cola funciona como una fila o
cola de personas, que esperan su turno para ser atendidas, la primera persona
atendida es siempre la primera de la fila y cuando llega una persona y queremos
incorporarla a cola o adicionarla debemos hacerlo por detrs de la ltima persona
en la cola.

Con fines educativos una cola se la puede representar grficamente as:

31

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

3.3.1 Representacin en Memoria Esttica y Dinmica.


Una vez comprendido en concepto ahora veamos como se implementa esto en un
lenguaje de programacin, por ahora lo implementaremos en Java. Pues bien
existen dos formas de implementar para que la cola sea o bien esttica
(reservamos un espacio fijo en memoria) o bien dinmica (el tamao en memoria
va creciendo segn se requiere), se implementa con arreglos con listas enlazadas
respectivamente

3.3.2 Operaciones bsicas con colas.


Existen 3 operaciones bsicas para una Cola.
Inicializar la Cola Q en nulo.
Inserta el elemento x en la Cola Q.
Elimina el elemento del frente de la Cola Q.
Checa si la Cola Q est vaca.

3.3.3 Tipos de colas: Simple, Cola Circular y Colas Dobles.


Estructura Cola de Objetos.

Colas En Java

public class Nodo {


public String info;
public Nodo enlace;
public Nodo(String s) {
info=s;
enlace=null;
}
}

import java.util.Scanner;
public class ColaDin {
private Nodo start,U;
public void add(String cadena) {
Nodo aux;
if(start==null){ // si la cola esta vacia
aux=new Nodo(cadena);
start=aux;
U=start;
}
else{
aux=new Nodo(cadena);

32

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
U.enlace=aux;
U=aux;
}
}
public void remove(){
Nodo aux=start;
if(aux==null)
System.out.println("Error. La cola esta vacia");
else
{
// aux=start;
if(start==U)
U=null;
System.out.println("Dato eliminado<"+start.info+">");
start=aux.enlace;
}
}
public void Consultas(){
Scanner leer=new Scanner(System.in);
Nodo aux=start;
while(aux!=null){
System.out.print(aux.info+"<-");
aux=aux.enlace;
}
char pausa=leer.next().charAt(0);
}
}
import java.util.Scanner;
public class TestCola {
public static void main(String[] args) {
Scanner leer=new Scanner(System.in);
char op;
ColaDin L= new ColaDin();
do{
Menu();
op=leer.next().charAt(0);
switch(op){
case 'I': case 'i':
System.out.println("MENU INSERTAR");
System.out.print("Dar cadena: ");String cadena=leer.next();
L.add(cadena);
L.Consultas(); break;
case 'E': case 'e':
System.out.println("MENU ELIMINAR");
L.remove();
L.Consultas(); break;
}
}while(op!='S'&& op!='s');
}
public static void Menu(){
System.out.println("MENU COLA");
System.out.println("Insertar");

33

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
System.out.println("Eliminar");
System.out.println("Salir");
}
}

Colas dobles:
Una bicola es una lista lineal en la que los elementos se pueden aadir o quitar por cualquier
extremo pero no por la mitad. El termino bicola hace referencia a que se puede ver como un cola bi
direccional.
Hay varias formas de representar una bicola en una computadora. A menos que se indique los
contrario, asumiremos que nuestras bicolas, se mantienen en un arreglo circular bicola con
punteros izquierdo y derechos, que apuntarn a los extremos de la bicola. Asumimos que los
elementos se encuentran entre el extremo izquierdo y el extremo derecho.
BICOLA DE ENTRADA RESTRINGIDA: Esta solo permite inserciones por uno de los dos extremos
de la cola, pero las eliminaciones pueden ser en cualquier extremo de la cola.
BICOLA DE SALIDA RESTRINGIDA: Esta solo permite eliminacin de elementos por uno de los
dos extremos, pero permite que se inserten por cualquiera de los dos.
Los algoritmos que insertan y eliminan elementos en bicolas son diferentes a los de las colas
circulares.

3.3.4 Aplicaciones: Colas de prioridad.

Una cola puede almacenar lo que nosotros queramos, nmeros, personas,


documentos, cualquier cosa. Esta estructura de datos tiene muchas aplicaciones
en la informtica al igual que la pila, por ejemplo cuando mandan a imprimir varios
documentos a una impresora, existe una cola de impresin que sigue la filosofa,
se imprimen los primeros documentos y si quiero imprimir un nuevo documento se
adiciona al final de todos los documentos que estn esperando a imprimirse.

Planificador de tareas o procesos en un Sistemas Operativo.


Reservaciones de boletos en una agencia de viajes.
Colas de atencin a clientes en una tienda de auto-servicio.
Teora de Colas en la Industria.

5. Estructuras no lineales.
4.1 Arboles.
4.1.1 Concepto de rbol.
Un rbol es una estructura no lineal que est compuesta de NODOS Y RAMAS. Por
ejemplo:

34

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

4.1.2 Clasificacin de rboles.


Arboles AVL
Arboles Binarios

Arboles Binarios. Un rbol binario es aquel donde cada nodo del rbol tiene 3 campos:
1.

DERECHO: Apuntador que indica la rama derecha de un nodo.

2.

INFO: Contiene la informacin del nodo.

3.

IZQUIERDO: Apuntador que indica la rama izquierda de un nodo. Por ejemplo:

REPRESENTACION GRAFICA DE UN ARBOL BINARIO.

35

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Un rbol binario de bsqueda es aquel que cada nodo cumple las siguientes caractersticas:
A. Es un rbol binario.
B. Los elementos de un rbol no se repiten.
C. Cada nodo del rbol cumple con las siguientes condiciones:
C.1 Todos los elementos de la izquierda son menores a la informacin que contiene ese
nodo.
C.2 Todos los elementos a la derecha son mayores a la informacin que contiene ese
nodo.

4.1.3 Operaciones bsicas sobre rboles binarios.


INSERCION EN UN ARBOL BINARIO
OPERACIONES DE ACCESO:
El algoritmo para INSERTAR en el rbol utiliza el mtodo establecido de insercin, por lo tanto los
pasos son:
a) Buscar el lugar donde insertar el nuevo nodo.
b) Cambiar los apuntadores para insertar el nuevo nodo dentro del rbol
Considerando que todos los elementos mayores a la informacin que contiene el nodo raz se
insertan a la derecha del rbol.
Todos los elementos menores a la informacin que contiene el nodo raz se insertan a la izquierda.
Por ejemplo:
Cmo se ingresa la informacin?
Como dije anteriormente, la informacin se ingresa de forma ordenada esto se resuelve de forma
muy sencilla con estos pasos:
1. Se toma el dato a ingresar X.

36

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
2. Partiendo de la raz preguntamos: Nodo == null ( o no existe ) ?
3. En caso afirmativo X pasa a ocupar el lugar del nodo y ya hemos ingresado nuestro primer
dato.
4. En caso negativo preguntamos: X < Nodo
5. En caso de ser menor pasamos al Nodo de la IZQUIERDA del que acabamos de preguntar
y repetimos desde el paso 2 partiendo del Nodo al que acabamos de visitar
6. En caso de ser mayor pasamos al Nodo de la DERECHA y tal cual hicimos con el caso
anterior repetimos desde el paso 2 partiendo de este nuevo Nodo.

ELIMINACION EN UN ARBOL BINARIO


Quiz no es una de las tareas ms sencillas, ya que se pueden presentar diferentes situaciones:

Borrar un Nodo sin hijos

Borrar un Nodo con un subrbol hijo

Borrar un Nodo con dos subrboles hijos

Veamos como resolver cada uno de estos casos.

37

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Caso 1 (Borrar un Nodo sin hijos): Borrar el nodo con el contenido 7


El caso ms sencillo, lo nico que hay que hacer es borrar el nodo y establecer el apuntador de su
padre a nulo.

38

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Caso 2 (Borrar un Nodo con un subrbol hijo): El nodo que contiene el valor 5
Este caso tampoco es muy complicado, nicamente tenemos que borrar el Nodo y el subrbol que
tena pasa a ocupar su lugar.

39

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

Caso 3 (Borrar un Nodo con dos subrboles hijos): Eliminar el nodo que contiene el valor 5

40

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
Este es un caso algo complejo, tenemos que tomar el hijo derecho del Nodo que queremos
eliminar y recorrer hasta el hijo ms a la izquierda ( hijo izquierdo y si este tiene hijo izquierdo
repetir hasta llegar al ltimo nodo a la izquierda), reemplazamos el valor del nodo que queremos
eliminar por el nodo que encontramos ( el hijo ms a la izquierda ), el nodo que encontramos por
ser el ms a la izquierda es imposible que tenga nodos a su izquierda pero s que es posible que
tenga un subrbol a la derecha, para terminar solo nos queda proceder a eliminar este nodo de las
formas que conocemos ( caso 1, caso 2 ) y tendremos la eliminacin completa.

41

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

42

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
RECORRIDOS EN UN ARBOL BINARIO
EXISTEN 3 MANERAS DE RECORRER UN ARBOL BINARIO:
1. PREORDEN: 2 + 3

= + 2 3

1.

Visitar la raz

2.

Recorrer el subarbol izquierdo en preorden

3.

Recorrer el subarbol derecho en preorden

/*Notacin PREORDEN + 2 3*/


public static void PreOrden(DatosArbol raiz){
if(raiz!=null) {
System.out.print(raiz.info+,);
PreOrden (raiz.izq);
PreOrden (raiz.der);
}
}
Resultado de recorrer el rbol de la figura 5.1.3: I,DA,F,E,K,J,O,N,M,X
2.ENTREORDEN: 2 + 3
1.
2.
3.

= 2 + 3 Ver Programa Arbol binario

Recorrer el subarbol izquierdo en entreorden


Visitar la raz
Recorrer el subarbol derecho en entreorden

/*Notacin ENTREORDEN 2 + 3*/


public static void EntreOrden(DatosArbol raiz){
if(raiz!=null) {
EntreOrden (raiz.izq);
System.out.print(raiz.info+",");
EntreOrden (raiz.der);
}
}
Resultado de recorrer el rbol de la figura 5.1.3: A,D,E,F,I,J,K,,M,N,O,X
3.

POSTORDEN 2 + 3

= 2 3 +

1. Recorrer el subarbol izquierdo en postorden


2. Recorrer el subarbol derecho en postorden
3. Visitar la raz
/*Notacin POSTORDEN 2 3 +*/
public static void PreOrden(DatosArbol raiz){
if(raiz!=null) {
PreOrden (raiz.izq);
PreOrden (raiz.der);
System.out.print(raiz.info+,);
}
}
Resultado de recorrer el rbol de la figura 5.1.3: A,E,F,D,J,M,N,X,O,K,I

43

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

4.1.4 Aplicaciones.

METODOS DE BUSQUEDAS EN ARCHIVOS


BASES DE DATOS
CLASIFICACION DE DATOS
COMPILADORES
INTELIGENCIA ARTIFICIAL

44

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
7.

Anlisis de los algoritmos.

El anlisis de algoritmos estima el consumo de recursos de un


algoritmo.
Algoritmo: Es un Mtodo, un proceso, un conjunto de instrucciones
utilizadas para resolver un problema especfico.
Un problema puede ser resuelto mediante muchos algoritmos.
Un algoritmo correcto, resuelve un problema definido y determinado.
La ventaja de conocer varias soluciones a un problema es que las diferentes
soluciones pueden ser ms eficientes para variaciones especficas del
problema o para diferentes entradas del mismo problema.
Propiedades de los algoritmos.
Especificacin precisa de la entrada. Debe dejar claros el nmero y tipo de valores de
entrada y las condiciones iniciales de deben cumplir esos valores de entrada para
conseguir que las operaciones tengan xitos.
Especificacin precisa de cada instruccin.
Exactitud y correccin. La salida correcta.
Etapas bien definidas.
Nmero finito de pasos.
Un algoritmo debe terminar.
Descripcin de resultados.
7.1 COMPLEJIDAD EN EL TIEMPO.
Para tener una medida del tiempo de ejecucin de un programa, se debe pensar en los factores
que tienen influencia en dicho valor.

Velocidad de procesamiento.
El compilador utilizado (calidad del cdigo generado).
Esta funcin se puede medir fsicamente (ejecutando el programa, reloj en mano), o
calcularse sobre el cdigo contando instrucciones a ejecutar y multiplicando por el tiempo
requerido por cada instruccin.

As, un trozo sencillo de programa como:


S1;
for (int i= 0; i < N; i++)
S2;
Requiere T(N)= t1 + t2*N, siendo t1 el tiempo que lleve ejecutar la serie S1 de sentencias, y t2 el
que lleve la serie S2.

45

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
Prcticamente todos los programas reales incluyen alguna sentencia condicional, haciendo que las
sentencias efectivamente ejecutadas dependan de los datos concretos que se le presenten.
Esto hace que ms que un valor T(N) debamos hablar de un rango de valores
Tmin(N) T(N) Tmax(N)
los extremos son habitualmente conocidos como el peor caso y el mejor caso.
Entre ambos se hallara algun caso promedio o ms frecuente.
Cualquier frmula T(N) incluye referencias al parmetro N y a una serie de constantes Ti que
dependen de factores externos al algoritmo como pueden ser la calidad del cdigo generado por el
compilador y la velocidad de ejecucin de instrucciones del ordenador que lo ejecuta.
Cdigo para crear un intervalo de tiempo

import java.io.*;
class tiempo{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
public static void main(String args[]) throws IOException{
long milisegundosactuales,milisegundos;
int tiempo = 0;
milisegundosactuales = System.currentTimeMillis();
//Variable para obtener el tiempo al abrir el programa
boolean evento = false;
//Booleano para no tener que repetir cdigo y poder marcar eventos
relacionados con el tiempo
while(true){
evento = false;
// Mtodo para obtener el tiempo actual
milisegundos = System.currentTimeMillis();
if (milisegundosactuales == milisegundos){
milisegundosactuales = milisegundos + 1000; //1000 milisegundos = 1
segundo
tiempo++;
System.out.println(tiempo);
evento = true;
System.out.println(evento);
}
else
//Metodo para evitar que se detenga el
if((milisegundosactuales + 1000) < milisegundos) contador
milisegundosactuales = System.currentTimeMillis();
}//fin while(true)
}// fin main

46

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
} // fin class tiempo

7.2. Complejidad en el espacio


COMPLEJIDAD
Otra consideracin a tener en cuenta a la hora de tratar con la complejidad es que si estamos
contando el tiempo que tarda un algoritmo en resolver un problema En qu procesador lo
ejecutamos? Parece obvio que el mismo algoritmo ejecutado en un procesador el doble de rpido
que otro tardar la mitad en encontrar la solucin. Cul debera ser entonces la unidad de medida
de la complejidad? Ninguna unidad de tiempo nos vale: ni segundos ni milisegundos, porque el
resultado variara de un ordenador a otro.
Adems el mismo algoritmo tardar ms o menos en solucionar un problema de un tamao u otro.
Es decir, no puede tardarse lo mismo en ordenar un arreglo de 100 valores que uno de 100000.
Nos podemos permitir esa simplificacin porque lo que realmente queremos saber es cmo crece
el nmero de instrucciones necesarias para resolver el problema con respecto al tamao del
problema.
COMPLEJIDAD EN ESPACIO
Es la memoria que utiliza un programa para su ejecucin. Lo que implica que la eficiencia en
memoria de un algoritmo lo indica la cantidad de espacio requerido para ejecutarlo, es decir, el
espacio memoria que ocupan todas las variables propias del algoritmo.
Es la memoria que utiliza un programa para su ejecucin; es decir, el espacio de memoria que
ocupan todas las variables propias del algoritmo.
Esta se divide en Memoria Esttica y Memoria Dinmica.
Memoria esttica. Para calcularla se suma de memoria que ocupan las variables declaradas en el
algoritmo.
Memoria dinmica. Su clculo no es tan simple ya que depende de cada ejecucin del algoritmo

Ejemplo1: Complejidad espacial:


public int getAverage ( int arr[] ) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum / arr.length;
}
En el ejemplo anterior tenemos una funcin que nos permite obtener el
promedio de un arreglo de nmeros.
Como no podemos saber el nmero de elementos que tiene este arreglo
decimos que tiene n elementos int, adems tenemos un elemento int (sum)
47

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.
Utilizando la notacin O podemos representar eso de la siguiente
manera: O(n+1)

7.3. Eficiencia de los algoritmos


Eficiencia. Es la propiedad mediante la cual un algoritmo debe alcanzar la solucin al problema en
el tiempo ms corto posible y utilizar la cantidad ms pequea de recursos fsicos.
Formato general de la eficiencia.
Esta se puede expresar mediante una funcin.
f(n)=eficiencia
Es decir, la eficiencia del algoritmo se examina como una funcin del nmero de elementos que
tienen que ser procesados.
Ciclos lineales:
En los ciclos se repiten las sentencias del cuerpo del ciclo un nmero determinado de veces, que
determina la eficiencia del mismo.
Ejemplo1.
for(int i=1; i<=n; i++)
System.out.printf(*);
La variable n es de tipo entero y tiene un valor de 100, la respuesta es 100 veces imprimir el
asterisco. El nmero de iteraciones es directamente proporcional al factor del ciclo n.
Como eficiencia es directamente proporcional al nmero de iteraciones, la funcin que expresa la
eficiencia es:
f(n)= n
Ejemplo2:
int n=5i;
i=1;
while(i<=n){
System.out.println(n*n*n);
i=i+2;
}
El valor de i se incrementa de 2 en 2, por lo que el nmero de iteraciones se divide entre dos n/2.
El factor de eficiencia es:
f(n)= n / 2
Ejemplo3:
Ciclos anidados:

48

ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.


PROF.CARPIO.

En el caso de los ciclos anidados, se determinan cuntas iteraciones contiene cada ciclo. El total
es entonces el producto del nmero de iteraciones del ciclo interno y el nmero de iteraciones del
ciclo externo.
int n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++)
System.out.print("*");
System.out.println();
}
Lineal logartmica

Dependencia cuadrtica

Cuadrtica

f(n)=[nlog n]
2

f(n)= n (n + 1)
2

f(n)= n

49

También podría gustarte