You are on page 1of 27

Apuntes de Estructura y Organizacin de Datos

3. Estructuras no lineales

3.1. Recursividad.

Definicin: Un funcin recursiva es una funcin que se llama a si mismo ya sea directa
o indirectamente.

La recursividad directa es el proceso por el cual un mtodo se llama asimismo


desde el mismo cuerpo del programa:

int fn() {
...
fn();
...
}

La recursividad indirecta implica ms de un mtodo, por ejemplo:

int fn1() {
...
fn2(. . .);
...
}

int fn2() {
...
fn1(. . .);
...
}

Uno de los requisitos que debe tener un proceso recursivo para considerarlo valido
es que debe tener una condicin de salida o condicin base, para que garantice el
no generar un secuencia infinita y agotara la memoria (Stack) Pila). Por
ejemplo:

El factorial de un nmero no negativo n (denotado por n!) es el producto de:

n! = n * (n-1) * (n-2) * 1

En el cual :

0! = 1
1! = 1
2! = 2 * 1
3! = 3 * 2 * 1
...

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Si n es igual a 5 tendremos:
5! 5 * 4*
3 *1 5 * 4! 5 * (4 * 3*
* 2 *1) 5 * 4 * 3!...
2
( 51)! ( 41)!
De modo que la funcin recursiva del factorial n sera:

n! = n * (n-1)! = n * (n-1) * ((n-1)-1)!...1

De tal manera que el factorial de un entero no negativo n mayor o igual a cero se


calculara de la siguiente forma:

n 0 1
n!
n 0 n * (n 1)!

Implementando de la funcin recursiva:

long factorial (long n) {


if (n == 0)
return 1;
else
return n * factorial(n-1);
}

La recursividad en el recorrido de las pilas

System.out.println( Factorial de 5 es: + factorial(5));

n=5
5*factorial(4)

n=4 4*factorial(3)
5*factorial(4)

3*factorial(2)
n=3
4*factorial(3)
5*factorial(4)

2*factorial(1)
3*factorial(2)
n=2
4*factorial(3)
5*factorial(4)

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

1*factorial(0)
2*factorial(1)
3*factorial(2)
n=1
4*factorial(3)
5*factorial(4)

1*1 = 1
2*factorial(1)
3*factorial(2)
4*factorial(3)
5*factorial(4)

2*1=2
3*factorial(2)
4*factorial(3)
5*factorial(4)

3*2=6
4*factorial(3)
5*factorial(4)

4*6=24
5*factorial(4)

5*24=120

Factorial de 5: 120

Ejemplos:

Deducir la funcin recursiva del producto de dos nmeros naturales. El producto


de a*b donde a y b son enteros positivos, tiene dos soluciones:

Solucin iterativa:
a *b a

a
a
a a
b veces
Solucin recursiva:
b 1 a
a * b
b 0 a a * (b 1)

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Por ejemplo 7 * 3 ser:

7 * 3 = 7 + 7 * (3-1) = 7 + 7 + 7*(2-1) = 7 + 7 + 7=21

La funcin recursiva quedara:

int producto (int a, int b) {


if (b == 1)
return a;
else
return a + a * (b - 1);
}

Deducir la funcin recursiva de la serie fibonacci: 0 1 1 2 3 5 8 13


La seria fibonacci comienzan con los nmeros 0 y 1, y el los dems resultan
de la suma de los dos ltimos:

0+1=1
1+1=2
1+2=3
2+3=5
3+5=8
5 + 8 = 13
..
.
Entonces podemos deducir que:

fibonacci(0) = 0
fibonacci(1) = 1


fibonacci(n)= fibonacci(n-1) + fibonacci(n-2)

Solucin recursiva:
n 0 || n 1 n
fibonacci(n)
n 2 fibonacci(n 1) fibonacci(n 2)

La funcin recursiva quedara:

long fibonacci(long n) {
if (n == 0 || n == 1)
return n;
else
return fibonacci(n-1) + fibonacci(n-2);
}

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Producto de Aprendizaje 3.1:

Escriba un programa que utilice una funcin recursiva mcd (mximo como
un divisor) de dos nmeros por el algoritmo de Euclides. El mcd de dos
nmeros a y b se define como el entero mayor que divide a ambos
nmeros. El mcd no est definido si tanto a como b son cero. Los valores
negativos de a y b se sustituyen por sus valores absolutos. Siempre debe
cumplirse la premisa a >= b. Si b = 0 el mcd es a. Por ejemplo el mcd(2970,
1265)

a b Operacin
2970 1265 2990 % 1265=440
1265 440 1265 % 440 = 385
440 385 440 % 385= 55
385 55 385 % 55 = 0
55 0 El mcd es 55

b 0 a
mcd (a, b)
b! 0 mcd (b, a % b)

Producto de Aprendizaje 3.2:

A. Implemente los mtodos recursivos de producto de dos nmeros naturales,


serie Fibonacci y Mximo Como un Divisor utilizando un men basado en
botones.

B. Elabore e implemente uno de los problemas siguientes programas


recursivos:

1. Programar un algoritmo recursivo que permita hacer la divisin por


restas sucesivas.
2. Programar un algoritmo recursivo que permita invertir un nmero.
Ejemplo: Entrada: 123 Salida: 321
3. Programar un algoritmo recursivo que permita sumar los dgitos de
un nmero. Ejemplo: Entrada: 123 Resultado: 6
4. Programar un algoritmo recursivo que permita sumar los elementos
de un vector.
5. Programar un algoritmo recursivo que permita multiplicar los
elementos de un vector.
6. Programar un algoritmo recursivo que permita sumar los elementos
de una matriz.
7. Programar un algoritmo recursivo que eleve a la potencia un nmero
xn.

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

3.2. rboles.

Las listas enlazadas, pilas y colas son estructuras de datos lineales (es decir,
secuenciales). Un rbol es una estructura bidimensional no lineal, con propiedades
especiales.

Por medio de los rboles se pueden representar estructuras jerrquicas, direcciones o


etiquetas de una manera organizada.

V4 V5 V6 V7

V2 V3

V1

Dentro de las ciencias computacionales, los rboles tienen muchas aplicaciones, entre
estas se encuentran:

Organizacin de tablas de smbolos en los compiladores.


Representacin de rboles de decisin.
Asignacin de bloques de memoria de tamao variable.
Ordenacin de datos.
Bsqueda de datos.
Solucin de juegos.
Teoremas.
Etc.

Definicin: Conjunto finito T de uno o ms nodos tal que:

v1 es el nodo raz.
vn-1 es el padre de vn.
v1, v2, , vn-1 son ancestros de vn.
vn es un hijo de vn-1.
Si a es un ancestro de b, entonces b es un descendiente de a.
Si a y b son hijos de c, entonces a y b son hermanos.
Si a no tiene hijos, entonces a es un vrtice terminal (o una hoja).
Si a no es un vrtice terminal, entonces a es un vrtice interno (o una rama).

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Nodo Raz
Vrtice
o V1
Nodo
Nivel 0
V3 V2
Arco Nivel 1

Nivel 2
V7 V6 V5 V4

Cada vrtice o nodo puede tener un nombre y una informacin asociada.


Un arco es una conexin entre dos vrtices o nodos.
Un camino es una lista de nodos diferentes en los que los nodos estn conectados
por medio de arcos. Una propiedad que se distingue a los rboles es que existe
exactamente un camino entre el nodo raz y cada uno de los nodos del rbol, por
ejemplo el camino desde la raz a la hoja v5, se representa v1, v2, v5 que incluye las
ramas (v1, v2) y (v2, v5) y su longitud es 2.
La altura o profundidad es la longitud del camino ms largo ms uno.
El nivel de un nodo es su distancia al nodo raz. El nodo raz tiene distancia cero.
Los hijos del nodo raz estn en el nivel uno, mientras que sus hijos estn en el
nivel 2 y as sucesivamente.
El grado de un nodo se determina por el nmero de hijos que tiene. Los nodos que
tienen grado cero son hojas.

Ejemplo:

B C

D E F G H

I J K L M N O

Cul es el camino de A-L?


Cules son los hijos de G?

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Cules son los nodos de grado cero?


Cules son los nodos de grado dos?
Cules son los nodos de grado tres?
Cul es la profundidad del rbol?

Representacin de un rbol

Existen varias formas de representacin de un rbol en forma grafica:


Niveles:

01 v1
02 v2
03 v4
03 v5
02 v3
03 v6
03 v7

Parntesis anidados:
v1(v2(v4,v5), v3(v6,v7))

Grafos:
V1

V3 V2

V7 V6 V5 V4

Diagrama de Venn:

v1
v2 v3

v4 v5 v6 v7

Un rbol ordenado es aquel que est estructurado bajo una organizacin especfica.

Representacin en memoria de rboles.

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

B C

D E / F / / H /

/ I / / J / / K / / L /

rboles generales.

Tambin mediante los rboles podemos representar situaciones de la vida diaria tales
como:

Presidente

Vice-Presidente Vice-Presidente
para asuntos para asuntos
Acadmicos Administrativos

Director de
Decano de Decano de Director de
Plantacin
Artes y Ciencias Comercio Adquisiciones
Acadmica

Jefe de
Jefe de Jefe de
Ciencias de la
Matemticas Contadura
Computacin

Urano

Afrodita Cronos Atlas Prometeo

Eros Zeus Poseidn Hades Ares

Apolo Atenas Hermes Heracles

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Seles
Seles
Navratilova
Graf
Sabatini
Graf
Graf

rboles binarios.

Definicin: Es un rbol en el cual sus nodos no puede tener ms de dos hijos.


Un rbol binario puede tener cero, uno o dos hijos. Al nodo izquierdo se le llama hijo
izquierdo y al nodo derecho hijo derecho.

B C

D E F

G H

Recorrido de rboles binarios.

Existen tres formas de recorrer un rbol binario, las cuales son Preorden, Incorden
Postorden.

Preorden

Preorden El recorrido es raz, hijo izquierdo e hijo derecho.(rid)

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Inorden

Inorden El recorrido es hijo izquierdo, raz e hijo derecho. (ird)

Postorden

Postorden El recorrido es hijo izquierdo, hijo derecho y raz. (idr)

Preorden:
20, 15, 10, 5, 12, 18, 17,
19, 33, 25, 21, 27, 50, 40,
70

Inorden:
5, 10, 12, 15, 17, 18, 19,
20, 21, 25, 27, 33, 40, 50,
70

Postorden:
5, 12, 10, 17, 19, 18, 15,
21, 27, 25, 40, 70, 50, 33,
20

Declaracin de un nodoArbol

class nodoArbol {

private nodoArbol hizq;


private int dato;
private nodoArbol hder;

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

nodoArbol( int dat ) {


this( null, dat, null );
}
nodoArbol( nodoArbol izq, int dat, nodoArbol der ) {
dato = dat;
hizq = izq;
hder = der;
}

int obtenDato() {
return dato;
}

nodoArbol obtenHIzq() {
return hizq;
}

nodoArbol obtenHDer() {
return hder;
}

void setDato(int dat) {


dato = dat;
}

void setHIzq(nodoArbol izq) {


hizq = izq;
}

void setHDer(nodoArbol der) {


hder = der;
}
}

Algoritmo preorden utilizando pilas

public static void preordenPila(nodoArbol r) {


tipoPila Pila = new tipoPila();
nodoArbol recorre;

Pila.insertar(null);
recorre = r;
while (recorre != null) {
procesar el nodo recorre
if (recorre.obtenHDer() != null)
Pila.insertar(recorre.obtenHDer());
if (recorre.obtenHIzq() != null)
recorre = recorre.obtenHIzq();
else
recorre = Pila.quitar();
}
}

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Algoritmo preorden recursivo

public static void preordenRecursivo(nodoArbol r) {


if (r != null) {
procesar el nodo r
preordenRecursivo(r.obtenHIzq());
preordenRecursivo(r.obtenHDer());
}
}

Algoritmo inorden utilizando pilas

public static void inordenPila(nodoArbol r) {


tipoPila Pila = new tipoPila();
nodoArbol recorre;

Pila.insertar(null);
recorre = r;
while (recorre != null) {
while (recorre != null) {
Pila.insertar(recorre);
recorre = recorre.obtenHIzq();
}
recorre = Pila.quitar();
while (recorre != null) {
procesar el nodo recorre
if (recorre.obtenHDer() != null) {
recorre = recorre.obtenHDer();
break;
}
recorre = Pila.quitar();
}
}
}

Algoritmo inorden recursivo

public static void inordenRecursivo(nodoArbol r) {


if (r != null) {
inordenRecursivo(r.obtenHIzq());
procesar el nodo r
inordenRecursivo(r.obtenHDer());
}
}

Algoritmo postorden utilizando pilas

public static void postordenPila(nodoArbol r) {


tipoPila Pila = new tipoPila();
nodoArbol recorre;

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Pila.insertar(null);
recorre = r;
while (recorre != null) {
while (recorre != null) {
Pila.insertar(recorre);
if (recorre.obtenHDer() != null)
Pila.insertar((-1) * recorre.obtenHDer());
recorre = recorre.obtenHIzq();
}
recorre = Pila.quitar();
while (recorre > 0) {
procesa el nodo recorre
recorre = Pila.quitar();
}
if (recorre < 0)
recorre = (-1) * recorre;
}
}

Algoritmo postorden recursivo

public static void postordenRecursivo(nodoArbol r) {


if (r != null) {
postordenRecursivo(r.obtenHIzq());
postordenRecursivo(r.obtenHDer());
procesar el nodo r
}
}

El siguiente programa crea un rbol ordenado ascendentemente, mostrando los datos


mediante el recorrido preorden y utiliza recursin. Primero solicita el nmero de nodos que
se darn de alta, posteriormente solicita el valor de cada nodo y va creando el rbol
binario, al final muestre la informacin.

1 // Ejemplo_Arboles
2
3 import javax.swing.JOptionPane;
4
5 class nodoArbol {
6 private nodoArbol hizq;
7 private int dato;
8 private nodoArbol hder;
9
10 nodoArbol( int dat ) {
11 this( null, dat, null );
12 }
13

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

14 nodoArbol( nodoArbol izq, int dat, nodoArbol der ) {


15 dato = dat;
16 hizq = izq;
17 hder = der;
18 }
19
20 int obtenDato() {
21 return dato;
22 }
23 nodoArbol obtenHIzq() {
24 return hizq;
25 }
26
27 nodoArbol obtenHDer() {
28 return hder;
29 }
30
31 void setDato(int dat) {
32 dato = dat;
33 }
34
35 void setHIzq(nodoArbol izq) {
36 hizq = izq;
37 }
38
39 void setHDer(nodoArbol der) {
40 hder = der;
41 }
42 }
43
44 class tipoPila {
45
46 final static int MAX_ELEMENTOS = 100;
47 private int error;
48 private int cima;
49 private nodoArbol elemento[];
50
51 public tipoPila() {
52 error = 0;
53 cima = -1;
54 elemento = new nodoArbol [MAX_ELEMENTOS];
55 }
56
57 public void insertar(nodoArbol d) {
58 if (!pilallena())
59 elemento[++cima]= d;
60 else
61 error = 1;
62 }

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

63
64 public nodoArbol quitar() {
65 if (!pilavacia())
66 return elemento[cima--];
67 else {
68 error = 2;
69 return null;
70 }
71 }
72
73 public boolean pilavacia() {
74 if (cima == -1)
75 return true;
76 else
77 return false;
78 }
79
80 public boolean pilallena() {
81 if (cima == (MAX_ELEMENTOS - 1))
82 return true;
83 else
84 return false;
85 }
86
87 public int muestraError() {
88 return error;
89 }
90 }
91
92 public class Ejemplo_Arbol {
93 public static void main(String [] args) {
94 int i,cuantos, inf;
95 nodoArbol nodo, recorre, raiz = null;
96
97 cuantos = Integer.parseInt(
98 JOptionPane.showInputDialog("Cuantos elementos deseas:") );
99
100 // Construccin del arbol ordenado
101 for (i=0; i < cuantos ; i++) {
102 inf = Integer.parseInt(
103 JOptionPane.showInputDialog("Dame el valor del nodo " + i + ":"));
104 nodo= new nodoArbol(inf);
105 if (raiz == null)
106 raiz = nodo;
107 else {
108 recorre = raiz;
109 while (true) {
110 if (nodo.obtenDato() > recorre.obtenDato())
111 if (recorre.obtenHDer() == null) {
112 recorre.setHDer(nodo);
113 break;

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

114 }
115 else
116 recorre = recorre.getHDer();
117 else
118 if (recorre.getHIzq() == null) {
119 recorre.setHIzq(nodo);
120 break;
121 }
122 else
123 recorre = recorre.getHIzq();
124 }
125 }
126 }
127 String Salida = "";
128
129 Salida += "Preorden:\n";
130 Salida += " Recursivo: " + preordenRecursivo(raiz) + "\n";
131
132 JOptionPane.showMessageDialog( null,Salida,
133 "Arbol Binario",JOptionPane.PLAIN_MESSAGE);
134 System.exit(0);
135 }
136
137 public static String preordenRecursivo(nodoArbol r) {
138 if (r != null) {
139 return r.obtenDato() + " " +
140 preordenRecursivo(r.obtenHIzq()) +
141 preordenRecursivo(r.obtenHDer());
142 }
143 else
144 return "";
145 }

Producto de Aprendizaje 3.3:

1. Elabore un programa en java que crea un rbol binario ordenado


ascendentemente de nmeros enteros y al final muestre los datos mediante el
recorrido preorden utilizando pilas y recursin.

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

2. Elabore un programa en java que crea un rbol binario ordenado


ascendentemente de nmeros enteros y al final muestre los datos mediante el
recorrido inorden utilizando pilas y recursin.

3. Elabore un programa en java que crea un rbol binario ordenado


ascendentemente de nmeros enteros y al final muestre los datos mediante el
recorrido postorden utilizando pilas y recursin.

4. Elabore un programa en java que crea un rbol binario ordenado


ascendentemente de cadena de caracteres e imprima cuantas hojas tiene el rbol.

5. Elabore un programa en java que crea un rbol binario ordenado


ascendentemente de cadena de caracteres e imprima cuantos nodos conforman
sus ramas.

6. Elabore un programa en java que crea un rbol binario ordenado


ascendentemente de cadena de caracteres e imprima cuantos nodos son abuelos.

7. Elabore un programa en java que crea un rbol binario ordenado


ascendentemente de nmeros enteros e imprima cuantos nodos son pares.

8. Elabore un programa en java que crea un rbol binario ordenado


ascendentemente de nmeros enteros e imprima cuantos nodos son impares.

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

9. Elabore un programa en java que crea un rbol binario ordenado


ascendentemente de nmeros enteros, solicite un nmero desde teclado e
imprima si se encuentra ese valor en el rbol.

10. Elabore un programa en java que crea un rbol binario ordenado


ascendentemente de nmeros enteros, solicite un nmero desde teclado,
posteriormente busque el nmero en el rbol y si lo encuentra regrese el nodo
donde lo encontr, en caso contrario regrese null.

3.3. Grafos.

Definicin.

Un grafo est representado por un conjunto de vrtices o nodos V y un conjunto de arcos


A, representado por G=(V,A). Un arco o arista representa una relacin entre dos nodos y
se representa por (u, v), siendo u y v el par de nodos.

Tipos de grafos.

Un grafo no dirigido es aquel en que sus arcos son pares no ordenados o no dirigidos.

Un grafo dirigido es aquel en el que sus arcos son pares ordenados o dirigidos (sus arcos
tiene una flecha que indica la direccin de la relacin). A un grafo dirigido tambin se le
llama diagrafo.

1 4 C E

5 H

7 9 D F
G=(V,A) G(V, A)
V={1, 4, 5, 7, 9} V={C, D, E, F, H}
A={(1, 4), (4, 1), (1, 5), A={ (C, D), (D, F), (E, C)
(5, 1), (4, 9), (9, 4), (5, 7), (E, H), (H, E) }
(7, 5), (7, 9), (9, 7)}
(a) (b)
(a) Grafo no dirigido y (b) Grafo dirigido

En ocasiones las relaciones entre nodos tienen asociado una magnitud denominada factor
o peso, y al grafo se le llama grafo ponderado.

Por ejemplo, los pueblos que forman una comarca, los nodos estn conformados por los
pueblos, los arcos por los caminos y los pesos es la distancia en kilmetros.

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

7 San
Lupiana Nicolas
5

12 El
Centenillo 6

Valleviejo El Novillo
7
Grafo ponderado
Grado de un nodo

En un grafo no dirigido el grado de un nodo v (grado(v)), es el nmero de arcos


que contiene el nodo v. Por ejemplo en el primer ejemplo de grafo no dirigido en el
inciso (a), el grado(9) = 2, ahora considerando grafo de la comarca tendremos que
el grado(Lupiana) = 3.

En un grafo dirigido se distingue entre grado de entrada y grado de salida; el grado


de entrada de un nodo v (gradoEntrada(v)), es el numero de arcos que entran al
nodo v y el grado de salida del nodo v (gradoSalida(v)), es el nmero de arcos que
salen de v. Por ejemplo en el primer ejemplo de grafo no dirigido en el inciso (b)
tendremos: gradoEntrada(E) = 1 y el gradoSalida(E) = 2.

Camino

Un camino P de longitud n, desde el vrtice v0 a vn, es un grafo G es la secuencia


de n+1 vrtices v0, v1, v2,, vn tal que (vi, vi+1) A(arcos) para 0 i n.
Matemticamente el camino se representa por P=(v0, v1, v2,, vn).

4 7

10
11

6 9

Grafo no dirigido

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Por ejemplo camino del nodo 4 al nodo 7 se representa por P1 = (4, 6, 9, 7) con una
longitud 3, otro camino seria P2=(10, 11). En el ejemplo de la comarca el camino P=
(Lupiana, Valleviejo, El Novillo) tiene una longitud de 19 (12 + 7).

Un camino P=(v0, v1, v2,, vn) es simple si todos los nodos que forman el camino son
distintos, pudiendo ser igual v0 y vn (los extremos del camino). Los caminos de P1 y P2
son caminos simples.

En un grafo dirigido, un ciclo es un camino simple cerrado. Por tanto, un ciclo empieza y
termina en el mismo nodo, v0 = vn,; debe tener ms de un arco. Un grafo dirigido sin ciclos
es llamado acclico (GDA-Grafo Dirigido Acclico). En general, un ciclo de longitud k se
denomina k-ciclo.

A B C

D E F

Grafo dirigido con ciclos

En la figura anterior se muestra un grafo dirigido en el que los vrtices (A, E, B, F, A)


forman un ciclo de longitud 4, por lo tanto es de 4-ciclo.

Un grafo no dirigido es conexo si existe un camino entre cualquier par de nodos que
forman el grafo y es fuertemente conexo si todos sus nodos estn conectados.

A C A C

E
F F

D D
(a) (b)
(a) Grafo conexo y (b) Grafo fuertemente conexo

Representacin de grafos en memoria.

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Primero considere los vrtices o nodos como nmeros consecutivos empezando del
ndice cero. Tome en cuenta que el nmero de nodos son finitos. Se puede elegir una
representacin secuencial, mediante un arreglo bidimensional conocida como matriz de
adyacencia; o bien una representacin mediante una estructura multienlazada,
denominada lista de adyacencia. La eleccin de una representacin u otra depende del
tipo de grafo y de las operaciones que se vayan a realizar sobre los vrtices y arcos. Para
un grafo denso lo menor es utilizar una matriz de adyacencia. Para un grafo disperso se
suelen utilizar listas de adyacencia.

Camino

Sea G=(V, A) un grafo de n nodos, siendo V={v0, v1, v2,..,vn-1} el conjunto de nodos, y
A={(vi, vj)} el conjunto de arcos. Los nodos se pueden representar por nmeros
consecutivos de 0 a n-1. La representacin de los arcos se hace con una matriz M de n
por n, denominada matriz de adyacencia, tal que cada elemento Mij puede tomar los
valores:

1 si hay un arco (v i , v j )
M ij
0 si no hay un arco (v i , v j )

Por ejemplo de un grafo dirigido:

Matriz de adyacencia:

0 1 2 3 4
D F K L R

0 D 0 1 1 0 0
1 F 1 0 0 0 0
2 K 0 0 0 0 0
3 L 0 1 1 0 0
4 R 1 0 0 0 0
Lista de adyacencia:

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

D F K /
F D /
K /
L F K /
R D /

Por ejemplo de un grafo no dirigido:

3 2

4 5

Matriz de adyacencia:

0 1 2 3 4
1 2 3 4 5

0 1 0 1 0 1 1
1 2 1 0 1 0 0
2 3 0 1 0 1 1
3 4 1 0 1 0 0
4 5 1 0 1 0 0

Lista de adyacencia:

1 2 4 5 /
2 1 3 /
3 2 4 /
4 1 3 /
5 1 3 /

Por ejemplo de un grafo ponderado:

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

5 5
A F L

4 5
8 9

W V
Matriz de adyacencia

0 1 2 3 4
A F L V W

0 A 0 0 0 0 0
1 F 5 0 5 5 0
2 L 0 0 0 0 9
3 V 8 0 0 0 0
4 W 0 4 0 0 0
Lista de adyacencia:
A /
F A 5 L 5 V 5 /
L W 9 /
V A 8 /
W F 4 /

Producto de Aprendizaje 3.4:

De los siguientes grafos represntelos en su matriz de adyacencia y lista de adyacencia.

10 San
Futuro Blass
6 8

5 Villa
4 Grande 6

El Rincon El
Rancho
8

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

a c

d e

v1 v2 v6

v4 v3 v5

Producto de Aprendizaje 3.5:

Elabore un programa en java que mediante teclado solicite el nmero de nodos de un


grafo, capture los valores del grafo e imprima la matriz de adyacencia y su lista de
adyacencia.

Recorrido de un Grafo

Recorrer un grafo consiste en visitar (procesar) cada uno de los nodos a partir de uno de sus
nodos, en otras palabras, recorrer un grafo consiste en visitar todos los nodos los vrtices
alcanzables a partir de un nodo de inicio.

Existen dos formas de recorrer un grafo:

Recorrido en anchura.- Para realizar el recorrido y procesar los nodos utiliza una cola
Recorrido en profundidad.- Para realizar el recorrido y procesar los nodos utiliza una pila

Recorrido en Anchura

Este mtodo hace uso de una cola como estructura en la que se mantienen los vrtices marcados
que se van a procesar El orden en que una cola trata los elementos hace que, a partir del vrtice
de partida, v, se procesen primero todos los nodos adyacentes a v, despus se procesen los nodos
adyacentes de estos que no estn procesados o visitados.

Algoritmo:

v nodo inicial
w nodo a procesar

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

TipoColaChar recorreAnchura(char matriz[][], char v) {


TipoColaChar Cola = new TipoColaChar();
TipoColaChar Procesado = new TipoColaChar();
char w;

Cola.insertar(v);

While (!Cola.colavacia()) {
w = Cola.quitar();
Si (!Procesado.buscarL(w)) {
Procesar(w);
Procesado.insertar(w);
}
Insertar a la Cola todos los vrtices adyacentes de w
}

Cola Procesados
D
BC D
CH B
HR C
RAT H
AT R
T A
T

Producto de Aprendizaje 3.6:

Implemente un mtodo para recorrer en anchura.

Recorrido en Profundidad

El recorrido comienza por el vrtice v, este se marca como procesado o visitado y se mete a la pila.
Despus se visitan en profundidad cada vrtice adyacente a v no procesado o visitado; as hasta
que no haya ms vrtices adyacentes no visitado o procesados. Esta estrategia de examinar los
nodos se denomina en profundidad por que la direccin de visitar es hacia adelante mientras sea
posible; al contrario que la bsqueda en anchura que primero visita todos los vrtices posibles en
amplitud.

Ene-Jun 2017 L.I. Arturo Lpez Ponce


Apuntes de Estructura y Organizacin de Datos

Algoritmo:

v nodo inicial
w nodo a procesar

TipoColaChar recorreProfundidad(char matriz[][], char v) {


TipoPilaChar Pila = new TipoPilaChar();
TipoColaChar Procesado = new TipoColaChar();
char w;

Pila.insertar(v);

While (!Pila.pilavacia()) {
w = Pila.quitar();
Si (!Procesado.buscarL(w)) {
Procesar(w);
Procesado.insertar(w);
}
Insertar a la Pila todos los vrtices adyacentes de w
}

Pila Procesados
D
BC D
BR C
BH R
BAT H
BA T
B A
B
Producto de Aprendizaje 3.7:

Implemente un mtodo para recorrer en profundidad.

Ene-Jun 2017 L.I. Arturo Lpez Ponce

You might also like