Sunteți pe pagina 1din 180

CAPÍTULO I.

1. SISTEMAS NUMERICOS.

1.1 OBJETIVO.

En este capítulo damos nociones elementales sobre el conocimiento de los números,


sistemas numéricos más utilizados, símbolos, reglas, overflow, realización de
operaciones aritméticas básicas y conversiones en los diferentes sistemas numéricos
previamente estudiados.

1.2 NUMERACIÓN.

Sistema. En esta área del conocimiento significa los símbolos o signos utilizados para
darles una expresión a los números.

NUMEROS ROMANOS.

Este sistema (tan bien conocido por nosotros) tuvo el mérito de ser capaz de expresar los
números del 1 al 1.000.000 con solo siete símbolos: I para el 1, V para el 5, X para el 10, L
para el 50, C para el 100, D para el 500 y M para el 1000. Es importante acotar que una
pequeña línea sobre el número multiplica su valor por mil.

En la actualidad los números romanos se usan para la historia y con fines decorativos. La
numeración romana tiene el inconveniente de no ser práctica para realizar cálculos escritos
con rapidez.

NUMERACIÓN ARÁBICA.

El sistema corriente de notación numérica que es utilizado hoy y en casi todo el mundo es
la numeración arábiga. Este sistema fue desarrollado primero por los hindúes y luego por
los árabes que introdujeron la innovación de la notación posicional; en la que los números
cambian su valor según su posición. La notación posicional solo es posible si existe un
numero para el cero. El guarismo 0 permite distinguir entre 11, 101 y 1001 sin tener que
agregar símbolos adicionales. Además todos los números se pueden expresar con sólo diez
guarismos, del 1 al 9 más el 0. La notación posicional ha facilitado muchísimo todos los
tipos de cálculos numéricos por escrito.

SISTEMAS NUMÉRICOS.

En matemáticas, varios sistemas de notación que se han usado o se usan para representar
cantidades abstractas denominadas números. Un sistema numérico está definido por la base
que utiliza. La base de un sistema numérico es el número de símbolos diferentes o
guarismos, necesarios para representar un número cualquiera de los infinitos posibles en el
sistema.

A lo largo de la historia se han utilizado multitud de sistemas numéricos diferentes.

Valores posicionales
La posición de una cifra indica el valor de dicha cifra en función de los valores
exponenciales de la base. En el sistema decimal, la cantidad representada por uno de los
diez dígitos -0, 1, 2, 3, 4, 5, 6, 7, 8 y 9- depende de la posición del número completo.

Para convertir un número n dado en base 10 a un número en base b, se divide (en el


sistema decimal) n por b, el cociente se divide de nuevo por b, y así sucesivamente hasta
obtener un cociente cero.

Sistema binario

El sistema binario desempeña un importante papel en la tecnología de las computadoras.


Los números se pueden representar en el sistema binario como la suma de varias potencias
de dos.

Ya que sólo se necesitan dos dígitos; el sistema binario se utiliza en las computadoras.

Números:

Palabra o símbolo utilizado para designar cantidades o entidades, que se comporten como
cantidades. Es la expresión de la relación existente entre una cantidad y otra magnitud que
sirve de unidad. Se pueden considerar números todos aquellos conceptos matemáticos para
los cuales se definen dos operaciones, de adición y multiplicación, cada una de las cuales
obedece a las propiedades conmutativa y asociativa.

CONJUNTOS NUMERICOS

Números Naturales

Dicho en términos muy simples, los números naturales son los que sirven para contar.

El conjunto de los números naturales tiene las siguientes propiedades:

 Al conjunto de los números naturales pertenecen el 0 y el 1.


 Si se suma a un natural el número 1 el resultado es otro número natural.
 Por lo tanto el conjunto de los naturales es un conjunto infinito.
 Las propiedades enunciadas anteriormente constituyen el Axioma de Inducción
Completa.

Números Enteros

El conjunto de números enteros, es también infinito.

Son parejas de números naturales (x,y), cuya resta x-y define un número entero.

Por ejemplo: la pareja (7,3) define el entero positivo 4 ya que 7 - 3 = 4. La pareja (2,4)
define el entero negativo -2 ya que 2 - 4 = -2.

Existe un isomorfismo entre parte del conjunto de los números enteros y el de los números
naturales; ya que el conjunto de los naturales es el de los enteros positivos.
Al conjunto de los enteros también pertenece el 0 que está definido por todas aquellas
parejas de naturales iguales (1,1) ; (56,56) ; etc.

Números Racionales

El conjunto de números racionales está integrado por parejas de números enteros cuyos
elementos se dividen entre sí.

A este conjunto también pertenece el 0, que está definido por todas aquellas fracciones que
tienen al 0 por numerador.

Los racionales serán positivos o negativos según sea el signo de cada uno de los
integrantes de las parejas que los definen.

Así será que parejas de enteros de igual signo definirán un racional positivo; y parejas de
enteros de distinto signo definirán un racional negativo.

No existen racionales cuyo denominador sea 0.

Números Reales

El campo de los números reales es más amplio que el de los racionales; ya que incluye
números que no están formados por parejas de enteros. Por ejemplo la relación que existe
entre una circunferencia y su diámetro no es un racional.(número

Se trata de un conjunto también infinito.

Siempre entre dos números reales hay otro número real; de ahí que se asocie al conjunto de
los números reales con una recta. La recta está formada por infinitos puntos y cada punto
representaría un número real.

1.3 PROCESO DE CUENTA.

En lugar del sistema numérico decimal, se puede utilizar la numeración binaria,


introducida en la ciencia de la matemática por Leibnitz en el siglo XVII, que solo utiliza
dos tipos de símbolos, el 0 y el 1. también es practico en computación, donde se utilizan
corrientemente números de base 8 y 16 elementos binarios, denominados sistema octal y
hexadecimal.

Por facilidad al usuario de este material se empezará con la creación de la siguiente tabla,
en la cual se inicia con el sistema decimal.

DECIMAL BINARIO OCTAL HEXADECIMAL

00 0 0 0

01 1 1 1

02 10 2 2
03 11 3 3

04 100 4 4

05 101 5 5

06 110 6 6

07 111 7 7

08 1000 10 8

09 1001 11 9

10 1010 12 A

11 1011 13 B

12 1100 14 C

13 1101 15 D

14 1110 16 E

15 1111 17 F

16 10000 20 10

17 10001 21 11

18 10010 22 12

19 10011 23 13

20 10100 24 14

21 10101 25 15

22 10110 26 16

23 10111 27 17

24 11000 30 18

25 11001 31 19

26 11010 32 1ª

27 11011 33 1B
28 11100 34 1C

29 11101 35 1D

30 11110 36 1E

31 11111 37 1F

32 100000 40 20

N… N… N… N…

Tabla 1.A: Cuatro sistemas de numeración en computación.

1.3 ANÁLISIS DE UN NÚMERO DECIMAL DIGITO POR DIGITO


 Número decimal = 6485.5810
 Parte entera = 6485
 Parte fraccionaria = .58
 Análisis del número decimal:
1. Parte entera 2. Parte fraccionaria
5 X 100 = 5 5 X 10-1 = .5
8 X 101 = + 80 8 X 10-2 = .08
2
4 X 10 = 400 .58
3
6 X 10 = 6000
6485
Por lo tanto el número 6485.5810 es igual a 6485.5810
1.4 CONVERSION DEL SISTEMA BINARIO A DECIMAL
a) Convertir 101112 a N10
1 X 20 = 1
1 X 21 = 2
1 X 22 = + 4
0 X 23 = 0
1 X 24 = 16
23
Significa que el número 101112 es igual a 2310 en decimal
b) Convertir 110101.01102 a N10
1.- Parte entera 2.- Parte fraccionaria
1 X 20 = 1 0 X 2-1 = .0
1
0 X 2 = 0 1 X 2-2 = + .25
1 X 22 = + 4 1 X 2-3 = .125
3
0 X 2 = 0 0 X 2-4 = .0
4
1 X 2 = 16 .375
1 X 25 = 32
53
Por lo tanto el número 110101.01102 es igual a 53.37510
1.5.- CONVERSION DEL SISTEMA DECIMAL AL BINARIO
Se lo puede efectuar a través del método de divisiones sucesivas, como se muestra en
los ejemplos que adjunto.
a) Convertir el número 8710 a N2

87 2
1 43 2
1
1 21 2
1 10 2
0
5 2

1 2 2
0 1 2
1
0
Por lo tanto el número 8710, convertido a binario es 10101112.
b) Convertir el número decimal 36.4410 a N2
1. Parte entera: 3610 2.- Parte fraccionaria: .4410
36 2 .44 X 2 = 0.88
0 18 2 .88 X 2 = 1.76
0 9 2 .76 X 2 = 1.52
1
4 2 .52 X 2 = 1.04
0 2 2
0 1 2
1 0
Por lo tanto el número 36.4410, convertir a binario es igual a 100100.01112
1.6.- OPERACIONES NUMERICAS BÄSICAS EN EL SISTEMA BINARIO
1.6.1.- Efectuar las siguientes sumas binarias:

a.- 1111012 b.- 101112


+ +
1110102 101102
11101112 1011012

c.- 1111102 d.- 1011.112


1011012 1111.112
1101112 1111.012
+ 1110112 + 1111.102
1111112 1111.112
1011112 1111.012
1001112 1111.112
1011100102 1101001.002
1.6.2 Efectuar las siguientes restas binarias

a.- 10002 b.- 10010112


- -
01102 1111012
00102 00011102

c.- 11011.012
- 1010.102
10001.102

1.6.3 MULTIPLICACION BINARIA

1.6.3.1 Multiplicación por sumas sucesivas

El método consiste en sumar el multiplicando a si mismo un número de veces


igual al multiplicador. Así para 10001 X 11 en binario (o sea, 17 X 3 = 51)
Por Ejemplo.
a.- 10001 X 11 b.- 11011 X 10
100012 110112
+ 100012 + 110112
100012 1101102
1100112

c.- 1101 X 111


11012
11012
11012
+ 11012
11012
11012
11012
10110112

1.6.3.2 Multiplicación mediante desplazamiento y suma

Consiste en ejecutar la multiplicación binaria de la misma decimal, se pone:

a.- 100012 b.- 110112


x 112 x 102
10001 00000
10001 11011
1100112 1101102

c.- 11012
x 1112
11012
1101
1101
10110112

1.6.4 DIVISION BINARIA


La división binaria se ejecuta como la división decimal Por Ejemplo:
a.- 10010102 / 1012
10010102 1012
- 000 011102
1001
-101
1000
-101
0111
-101
0100
-000
100
Por lo tanto 10010102 dividido para 1012 da 011102 con un resto de 1002
b.- 1001101012/ 1012

1001101012 1012
-101 1111012
1001
-101
1000
-101
0111
-101
0100
-000
1001
-101
100
Por lo tanto 1001101012 dividido para 1012 da 1111012 con una resto de 1002
1.7 SISTEMA OCTAL.
1.7.1 Efectuar las siguientes sumas octales:

a.- 4274378 b.- 345.6728


243578 + 67.2578
+ 654328 435.1518
5414508
1.7.2 Efectuar las siguientes restas:
a.- 467568 b.- 76543221.368
- 247548 - 436651.028
220028 76104350.348

c.- 10101257.4638
- 66567.5428
10012467.7218

1.7.3 Efectuar las siguientes multiplicaciones:

a.- 545238 b.- 2710654.218


x 228 x 546.238
131246 1053240463
131246 562153042
14437268 2126501146
1344326104
1635413525
201422304617038
1.7.4 efectuar las siguientes divisiones:
a.- 1432568 / 178
1432568 178
-132 64768
112
-74
165
-151
146
-132
14
1.8 SISTEMA HEXADECIMAL
1.8.1.- Efectuar las siguientes sumas en hexadecimal.
a.- 4A365B16 b.- A2B9CF16
+ 24BFD16 +4B3A9 16
4 C815816 A76D78 16
1.8.2 Efectuar las siguientes restas:
a.- A2B9CF16 b.- DAC.6FD916
-4B3A916 6.29EA16
9E062616 DA6.45EF16
1.8.3. Efectuar las siguientes multiplicaciones
a.- 2D5F16 b.- 2 2 5 F16
x A5B16 x 9 5 B16
1F315 1 7 A1 5
E2DB AB DB
1C5B6 135 5 7
1D5D6C516 14 1B EC516
1.8.4 Efectuar la siguiente división
a.- BA23CF9816 / 2A916
BA23CF9816 2A916
-AA4 45F92916
FE3
-D4D
296C
-27E7
185F
-17F1
6E9
-552
1978
-17F1
187

1.9. CONVERTIR ENTRE LOS SISTEMAS DECIMAL Y HEXADECIMAL


1.9.1 Convertir de decimal a hexadecimal:

a.- 243510 a N16 Por lo tanto 243510 = 98316


2435 16
3 152 16
8 9 16
9
0
b.- 8799.23610 a N16
Parte entera Parte fraccionaria
8799 16 .236 X 16 = 3.776
F 549 16 .776 X 16 = C.416
5
34 16 .416 X 16 = 6.656
2
2 16 .656 X 16 = A.496
2 0 .496 X 16 = 7.936
Por lo tanto 8799.23610 = 225F.3C6A716
1.9.2 Convertir de hexadecimal a decimal
a.- A2B9CF16 a N10
F = 15 X 160 = 15
C = 12 X 161 = 192
9 = 9 X 162 = + 2304
B = 11 X 163 = 45056
4
2 = 2 X 16 = 131072
A = 10 X 165 = 10485760
10664399
Por lo tanto A2B9CF16 = 1066439910

b.- A2C.F316 a N10


Parte entera Parte fraccionaria

C = 12 X 100 = 12 F = 15 X 16-1 = .9375


2 = 2 X 161 = +32 3 = 3 X 16-2 = .011718
A = 10 X 162 = 2560 .949218
2604
Por lo tanto A2C.F316 = 2604.94921810

1.10 CONVERSION RAPIDA ENTRE SISTEMAS BINARIOS, OCTAL Y


HEXADECIMAL
Para convertir un número del sistema binario al sistema octal, se separa el número
en grupos de 3 bits y se pone para cada grupo su equivalencia en octal. Para
convertir un número del sistema binario al hexadecimal, se separa el número en
grupos de 4 bits, y se pone para cada grupo su equivalencia en hexadecimal.
Para pasar de octal hexadecimal al binario, el proceso es el inverso del que quedo
descrito anteriormente.
1.10.1 Conversión de octal a binario:
a.- 4567268 a N2
4 5 6 7 2 6
110
010
111
110
101
100
Por lo tanto 4567268 = 1001011101110101102

b.- 6743.28 a N2
6 7 4 3 . 2
.010
011
100
111
110
Por lo tanto 6743.28 = 110111100011.0102

1.10.2 Conversión de hexadecimal a binario

a.- 67ABC916 a N2

6 7 A B C 9
1001
1100
1011
1010
0111
0110
Por lo tanto 67ABC916 = 0110011110101011110010012
b.- 334BD.A316 a N2
3 3 4 B D . A 2
0011
. 1010
1101
1011
0100
0011
0011
Por lo tanto 334BD.A316 = 00110011010010111101.101000112
1.10.3 Conversión de binario a octal:
a.- 11011111102 a N8
0 0 1 1 0 1 1 1 1 1 1 0
1 5 7 6
Por lo tanto 11011111102 = 15768
b.- 1101110.102 a N8
0 0 1 1 0 1 1 1 0 . 1 0 0
1 5 6 4
Por lo tanto 1101110.102 = 156.48
1.10.4 Conversión de binario a hexadecimal
a.- 1101111111001102 a N16
0 1 1 0 1 1 1 1 1 1 1 0 0 1 1 0
6 F E 6
Por lo tanto 1101111111001102 = 6FE616
b.- 1010101011.102 a N16
0 0 1 0 1 0 1 0 1 0 1 1 . 1 0 0 0
2 A B 8
Por lo tanto 1010101011.102 = 2AB.816
1.11 CONVERSION ENTRE TODOS LOS SISTEMAS NUMERICOS
Para convertir un número de cualquier base a una base que ud. desee llegar, lleve a
cabo los siguientes pasos:
1. Número X
2. El número X conviértalo a base 10
3. De base 10, convierta a la base deseada Y
Para mayor información fíjese en el grafico Nº 1 y en el ejemplo que se adjunta

5 2 3

7 4
10
N

16 6 GRAFICO 1.
13
P.E.

Convertir el número 43.67 a N3

1.- Parte entera Parte fraccionaria

3 X 70 = 3 6 x 7-1 = .8571426
4 X 71 = 28
31
2.- 43.67 = 31. 857142610

3.- Parte entera Parte fraccionaria

31 3 .8571426 X 3 = 2.5714278
1 10 3 .5714278 X 3 = 1.7142834
1 3 3 .7142834 X 3 = 2.1428502
0 1 3
1 0

Entonces el número 31.857142610 = 1011.2123


Por lo tanto 43.67 = 31.857142610 = 1011.2123 (NUMERO BUSCADO)
1.12 NUMEROS BINARIOS NEGATIVOS
1.12.1 Codificación en valor absoluto y signo
El número binario negativo puede ser codificado de varias formas lo
fundamental es prever un bit de signo: generalmente es un 0 para el +, y un 1
para el menos.
Así, el número 1310, que se escribe 1101 en binario da + 13 10 = 011012 y
-1310 = 111012
Existen otros procedimientos de codificación. Para recordarlos es conveniente
atenerse a dos definiciones:
1.12.2 El complemento A2
Se obtiene el complemento A2 (0 complemento verdadero) de un número
binario añadiendo 1 al complemento restringido, así
 El complemento a 2 de 1011 es 0100 + 1 = 0101;
 El complemento a 2 de 0100 es 1011 + 1 = 1100.
1.12.3 El complemento A 1
Se forma el complemento a 1 (0 complemento restringido) de un número
binario, cambiando todos los ceros por unos, y todos los unos en ceros, Por
Ejemplo.:
 El complemento A 1 de 1011 es 0100;
 El complemento A 1 de 0100 es 1011.
1.12.4 Otras formas de codificación de números negativos
Los complementos A1 y A2 proporcionan, pues, otros medios de codificar los
números binarios negativos, como se muestran en la tabla 1ª

DECIMAL VALOR ABSOLUTO COMPLEMENTO COMPLEMENTO


Y SIGNO RESTRINGIDO (A1) VERDADERO (A2)
+1 0 0001
+0 0 0000 0 0000 0 0000
-0 1 0000 1 1111 1 0000
-1 1 0001 1 1110 1 1111
-2 1 0010 1 1101 1 1110
: : : :
: : : :
-7 1 0111 1 1000 1 1001
-8 1 1000 1 0111 1 1000
-9 1 1001 1 0110 1 0111

TABLA 1 A LOS COMPLEMENTOS A1 Y A2 DE LOS NUMEROS NEGATIVOS

1.12.5 Operaciones
1.12.5.1 Codificación en valor absoluto y signo
Recuerde que consiste en dedicar el bit más significativo de la
izquierda como signo.
Si = 1 es negativo
Si = 0 es positivo
Por Ejemplo.
7=0 111
Signo (positivo)
-7 = 1 111
Signo (negativo)
5= 0 101
Signo (positivo)
-2 = 1 010
Signo (negativo)
1.12.5.2 Complemento A2
a.- Representar -5 en complemento A2 y con cuatro bits
5 = 0 1 0 1
Complemento = 1 0 1 0
Agregar 1 = + 1
-5 = 1 0 1 1
Por lo tanto el número negativo -510 = 10112
b.- Representar -8 en complemento A2 y con cinco bits
8 = 0 1 0 0 0
Complemento = 1 0 1 1 1
Agregar 1 = + 1
-8 = 1 1 0 0 0
Por lo tanto el número negativo -810 = 110002
c.- Ejecutar en complemento A2 con cuatro bits -7 + 5
-7 = 1 0 0 1 7 = 0 1 1 1
5 = 0 1 0 1 1 0 0 0
1 1 1 0 + 1
-7 = 1 0 0 1
Por lo tanto el resultado de -7 +5 = 1110.

Significa que el resultado para la computadora es 1110


Es prudente informar que los números positivos son también los
complementos A2 de los números negativos.
Por Ejemplo.:
El complemento del numero anterior A2.
1 1 1 0
0 0 0 1
+ 1
0 0 1 0 = resultado positivo
d.- ejecutar 5 -1 a complemento A2 con cuatro bits.
5 = 0101 1 = 0001
+1111 1110

1 0100 +1
Se ignora -1 = 1111
Por lo tanto el resultado de 5 – 110 = 01002
e.- Ejecutar 4 – (-2) a complemento A2 con 4 bits.
4 = 0 1 0 0 2 = 0 0 1 0
2 = + 0 0 1 0 1 1 0 1
6 = 0 1 1 0 +1
-2 = 1 1 1 0
0 0 0 1
+ 1
- (-2) = 0 0 1 0
Por lo tanto el resultado de 4 – (-2)10 = 0 1 1 0
f.- Ejecutar 7 -3 a complemento A2 con 4 bits.
7 = 0 1 1 1 3= 0 0 1 1
-3 = 1 1 0 1 1 1 0 0
1 0 1 0 0 + 1
Se ignora -3 = 1 1 0 1
1.12.5.3 Complemento A1
El complemento A 1 se obtiene complementando cada uno de sus
bits.
P. E.:
Representar -5 con 4 bits
5 = 0 1 0 1
-5 = 1 0 1 0

La suma se realiza igual que en el complemento A2, pero cuando


ocurre acarreo se suma uno al resultado final

a.- Ejecute -7+5 a complemento A1 con 4 bits


-7 = 1 0 0 0 7 = 0 1 1 1
5=+ 0 1 0 1 -7 = 1 0 0 0
1 1 0 1 = (resultado para la computadora)

b.- Ejecutar -1+6 a complemento A1


-1 = 1 1 1 0 1 = 0 0 0 1
6 = +0 1 1 0 -1 = 1 1 1 0
1 0 1 0 0
Acarreo
0 1 0 0
+ 1
0 1 0 1 = 5 (cantidad positiva)
c.- Ejecutar 5 – 2 a complemento A 1 con cuatro bits
5 = 0 1 0 1 2 = 0 0 1 0
-2 = + 1 1 0 1 -2 = 1 1 0 1
1
0 0 1 0
Acarreo
0 0 1 0
+ 1
0 0 1 1 = 3 (cantidad positiva)

Por lo tanto el resultado de 5 -2 10 = 0 0 1 12

1.12.6 Método para detectar sobre capacidad (overflow) en números


complementados A2.

1. Antes de sumar las dos cantidades se repite el bit más significativo (mas a
la izquierda).
2. Ejecutar la suma usando N + bits, ignorar el acarreo en el bit N+ 2
3. Examinar los dos últimos bits, el resultado del bit N+1; hay overflow o
sobre capacidad si los dos bit más a la izquierda no son idénticos.

a.- Ejecutar -7+5 a complemento A2

-7 = 1n+1 1n 0 0 1 7 = 0 1 1 1
5 = 0n+1 0n 1 0 1 1 0 0 0
1 1 1 1 0 +1
= -7 = 1 0 0 1
Son idénticos por lo tanto
No hay overflow.

b.- Ejecutar 6+4 a complemento A2

6 = 0n+1 0n 1 1 0
-5 = 0n+1 0n 1 0 1
0 1 0 1 0

= No son idénticos por lo tanto


Existe overflow.
1.12.7. Overflow en complemento A1
El procedimiento es idéntico al complemento A 2, solo que cuatro aparezca el
bit N +1 este se debe adicionar al resultado.
P.E.:
a.- Ejecutar 5+2 al complemento A1 con cuatro bits.
5 = 0n+1 0n 1 0 1
-5 = 0n+1 0n 0 1 0
0 0 1 1 1
=
El resultado es idéntico
No hay overflow.
b.- Ejecutar -4-4 al complemento A 1
-4 = 1n+1 1n 0 1 1 4 = 0 1 0 0
4 = 1n+1 1n 0 1 1 -4 = 1 0 1 1
1 1 0 1 1 0
+ 1
1 0 1 1 1
=
El resultado no es idéntico
Por lo tanto existe overflow.
1.13 Efectuar los siguientes problemas:

a.- Convertir del sistema binario al decimal:

 1110101112 a N10
 1101001.11012 a N10
 10011111.11012 a N10

b.- Convertir del sistema decimal al binario

 8610 a N2
 69.4610 a N2
 99.9610 a N2

c.- Efectuar las siguientes operaciones binarias

11110112 111110.112
+ 11111002 001011.012
10110112 + 110111.112
10110112 110111.112
101110.112
011111.102

11010102 101101.1012
-01101112 - 011101.1112

1101111 x 101 11101111 x 11112


1011112/112 111110112/1012

d.- Efectuar las siguientes operaciones octales:

2456328 10647.678
+ 5434648 + 01432.568
6532458 12346.778

6674328 3456.7678
- 2432148 - 367.6768

456768 x 2438 4567765438 x 2458

46576628 / 428
e.- Efectuar las siguientes operaciones hexadecimales:

1AB69F16 6FACA916
+ 24 678A16 - 467 ABB16
56 78BB16

ABCFA916 x A916 A6F645616 / BB416


f.- Convertir de decimal a hexadecimal:

16964810 a N16 96789.68910 a N16

g.- Convertir de hexadecimal a decimal

ABCF96.AB916 a N10 AB643BCF16 a N10


h.- Convertir entre todos los sistemas numéricos.

ABCA696.ACB16 a N3 6801045.67410 a N4
i.- Efectuar las siguientes operaciones con complementos:
 Ejecutar 5 + 4 a complemento A2
 Ejecutar 7 – 6 a complemento A2
 Ejecutar -8 – 2 a complemento A2
 Ejecutar -6 – 5 +2 a complemento A2

 Ejecutar 3 + 4 a complemento A1
 Ejecutar 8 - 4 a complemento A1
 Ejecutar 5-(-3) a complemento A1
 Ejecutar 6-(-7)-2 a complemento A1
Trabajo elaborado por Ing. Marco Ocampo C.

BIBLIOGRAFIA
LILEN H. Del Microprocesador al Microordenador, Editorial Boixareu Barcelona –
España

CAPITULO II
 ALGEBRA BOLEANA
 DEFINICION: Algebra para expresar relaciones lógicas denominadas en honor
del científico George Boole (1815-1864).
 MECANISMOS DE LA ALGEBRA DE BOOLE Y LA NORMAL

CONJUNTOS BOOLE
0 1
1 0
0 U
0 0
U 1
*
U +
U O

 AXIOMAS DEL ALGEBRA DE BOOLE:


1_ (1) (1) = 1 1_ 1+1 = 1
2_ (1) (0) = 0 2_ 0+1 = 1
3_ (0) (0) = 0 3_ 0+0 = 0
4_ 1 = 0 4_ 0 =1
 TEOREMAS DEL ALGEBRA DE BOOLE:

1.- 0. x = 0 0 x = 0 1.- 0+x=x 0Ux 0 x


2.- 1. x = x u x = x 2.- 1+x=1 uUx = x
3.- x. x = x x x = x 3.- x+x=x xUx = x
4.- x. x = x x x = 0 4.- x+x=1 xUx = u
5.- XY = YX PROP.CONM. 5.- x + y = y+x
6.- xyz = (x)(yz)ó (xy)(z) prop. Aso. 6.- x + y + z = x+(y+z)ó(x+y)+z

4.1. REOMENDACIONES PARA LA COMPROBACION DE TEOREMAS DE


BOOLE

1. Se tratara de comprobar aplicando teoremas básicos del (1 al 16)


2. se realizara el miembro más complicado, ejecutando operaciones y se
tratara de igualar con el más simple.
3. Después de realizar el miembro mas complicado, se agregan literales en
forma de unos o ceros según el caso
4. Se tratara de comprobar con algún teorema no básico pero previamente
comprobado.

4.2. FORMA DE AGRAGAR UNOS EN UNA FUNCION BOLEANA


Ej. Agregar al teorema xy la variable u en forma de unos (1’s)
1ero xy ( u + u ) = xyu + xyu :. Esto es = xy ( u + u) = xy (1) :. xy
2do xy ( 1+ u ) = xy + xyu :. Esto es = xy ( 1 + u ) = xy (1) :. xy
3er xy ( 1+ u ) = xy + xyu:. Esto es = xy ( 1 + 0 ) = xy (1) :. xy
4.3. PLANTEAMIENTO Y SOLUCION DE TEOREMAS:
Ejemplo demostrativo:

1_a) x+yz = x+yz 1_b) x + y z = x + y z


x(y+y)+yz = x + y z x(y+1)+yz = x + y z
xy+xy+yz = x + y z xy+x+yz = x + y z
x(y+y)+yz = x + y z x(1+y)+yz = x + y z
x (1) + y z = x + y z x (1) + y z = x + y z
x+yz =x+yz x+yz =x+yz
1_c) x + y z =x+yz
x(y+1)+yz = x + y z
xy+x+yz = x + y z
x(1+y)+yz = x + y z
x(1) + y z = x + y z
x+yz =x+yz

1A x y + x z = x (y+z) 1B_ (x+y) (x+z) = x + y z


x ( y z ) = x (y+z) x+xz+xy+yz = x + y z
x(1+z+y)+yz = x + y z
x(1) + yz =x+yz
x+yz = x+yz

2A_ x y + x y = x 2B_ (x+y) (x+y) =x


x (y+y) = x x+xy+xy+yy =x
x(1) = x x(1+y+y)+0 =x
x =x x(1) =x
x =x

3A_ x + x y = x 3B_ x (x+y) = x


x (1+y) = x x + xy = x
x(1) = x x (1+y) = x
x =x x (1) = x
x =x

4A_ x+xy=x+y 4B_ x (x+y) = x y


x(y+1)+xy = x + y xx+xy=xy
xy+x+xy = x + y 0+xy=xy
x+y+(x+x) = x + y xy =xy
x + y(1) = x + y
x+y =x+y

5A_ zx + zxy = zx + zy 5A'_ xy + xz + yz = xy + xz


zx(y+1)+zxy = zx + zy xy+xz+yz(x+x) = xy + xz
zxy+zx+zxy = zx + zy xy+xz+xyz+xyz = xy + xz
zx+zy(x+x) = zx + zy xy(1+z)+xz(1+y) = xy + xz
zx + zy(1) = zx + zy xy (1) +xz (1) = xy + xz
zx+zy = zx +zy xy + xz = xy + xz
4.5. TEOREMAS DE DEMORGAM
El teorema o ley de de morgan se puede explicar de la siguiente forma:
1.- Si cada variable se sustituye por su complemento
2.- Cada suma por multiplicación y c/multiplicación por suma
3.- En último se obtiene la función complemento
 FUNCIONES DUALES:
Dos funciones serán duales si difieren únicamente por el intercambio
simultáneo:
(+ sust. Por x )
( x sust. Por + )
Ej. (x,y,z)= x.y.z + x y z + x y z
 FUNCION COMPLEMENTO
Esto se obtiene 1ero buscando el dual de la función 2do complementando
c/una de las variables.
FUNCION: F (x,y,z) = (x+y+z) (x+y+z) (x+y+z)
DUAL : F (x,y,z) = x y z + x y z + x y z
COMPLEMENTO: F (x, y , z) = x y z + x y z + x y z
 Ahora puede aplicar la Ley De Demorgan así:
 DEMORGAN F(x, y, z ) = x y z +x y z + x y z
 Realizar los siguientes problemas y aplique la ley de demorgan

1_ F= X1 X2 X3 + X1 X2 X3 + X1 X2 X3
DUAL F= (X1 X2 X3) + (X1 X2 X3) +(X1 X2 X3)
COMPLEMENTO F= (X1 X2 X3) + (X1 X2 X3) +(X1 X2 X3)
DE DEMORGAN F= (X1 X2 X3) + (X1 X2 X3) +(X1 X2 X3)
2_ F= (X1 X2 X3) + (X1 X2 X3) +(X1 X2 X3)
DUAL F= X1 X2 X3 + X1 X2 X3 +X1 X2 X3
COMPLEMENTO F= X1 X2 X3 + X1 X2 X3 +X1 X2 X3
DE DEMORGAN F= X1 X2 X3 + X1 X2 X3 +X1 X2 X3
3_ F= c + xy = x (x+y) :. = x (x+y)

4_ F= (A+B) c+D E:.= (AB+C)D+E

5_ F= AB+(CD+AB)E F:.= (A+B) (((C+D)(A+B)+E)+ F

6_ F= (AB+C) D+E:.= (A+B) C+D E

 EJERCICIOS PROPUESTOS: FUNCIONES DE BOOLE

1_ BC + AC + AB = AB + AC
2_ (A+C) (A+B+C) = (A+C) (B+C)
3_ X1+X1 X2 = X1+X2
4_ (A+B) (A+C) = A + BC
5_ zx + zxy = zx +y
6_ xy + xz +yz = xy + xz
7_ (x+y) (x+y) = x
8_ zx + zxy = zx + zy
9_ X1 X2 X3 + X1 X2 + X1 X2 X3 + X2 X3: TEOREMAS DE DEMORGAN
10_ (z+x) (x+z+y) (x+z+y)
11_ (ABC) + (AB)+B C

12_ X1 (X2+X3+X4) +X5 X6

13_ P(Q+Y)

14_ (M+B) K+D W

15_ (ABC) (ABC) E

6B_ x+y = xy x+y = xy


(x+y) (xy) = 0 x+y + xy = 1
(x+y) (xy) = 0 x+y + xy = 1
(0+y)(x 0) = 0 x(y+y)+y(x+x)+xy = 1
(y) (0) = 0 xy+xy+xy+xy = 1
0 =0 x(y+y)+x(y+y) = 1
x(1)+x(1) = 1
x+x = 1

EJERCICIOS PROPUESTOS

1_ BC + AC + AB = AB + AC
2_ (A+C) (A+B+C) = (A+C) (B+C)
3_ X1 + X1X2 = X1+X2
4_ (A+B) (A+C) = A + BC
5_ zx + zxy = zx + y
6_ xy + xz + yz = xy +xz
7_ (x+y) (x+y) = x
8_ zx + zxy = zx + zy
9_ X1X2X3 + X1X2 + X1X2X3 + X2X3 (DE DEMORGAN)
10_ (z+x) (x+z+y) (x+z+y)
11_ (ABC)+(AB)+B C

12_ (X1+X2X3X4)+ X5 X6

13_ (X1+X2X3X4) X5+X6


14_ P(Q+Y)

15_ (M+B)K+D W

TABLAS DE VERDAD Y MINIMIZACION DE FUNCIONES DE BOOLE CON LA


APLICACION DE TEOREMAS

1_ TABLAS DE VERDAD, VERACIDAD O PRUEBA DE INDUCCION PERFECTA.


Esta tabla e una forma de comprobación que contiene todas las combinaciones
posibles de una función de BOOLE o de un grupo de variables.
La forma de cómo se desarrolla una tabla de verdad se describe con el siguiente
ejemplo:
Ej: desarrolle una tabla de verdad para cuatro variables (A,B,C,D)
N variables tiene 2n combinaciones distintas, por lo que para este ejemplo
tendremos 24 combinaciones distintas
TABLA
No 2 2 2 2
A B C D
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
RELACION DE 8 1 0 0 0 NUMEROS
DECIMALES Y SU 9 1 0 0 1 EQUIVALENCIA A N2
10 1 0 1 0
BINARIA 11 2 12 20 2 12 21
1410 = N2 12 1 11 1 01 00
3310 = N2 13 1 10 01 0 00 11
610 = N2 14 1 1 1 11 00
1010 = N2 15 1 11 0 11 01
4310 = N2 1 0 1 0 1 1
4410 = N2 1 0 1 1 0 0
6010 = N2 1 1 1 1 0 0
6310 = N2 1 1 1 1 1 1
ETC N2

6.2. UTILIZACION DE LA TABLA DE VERDAD COMO MEDIO DE VERDAD


6.2.1 COMPROBACION DE TEOREMAS:
1_ XY = X + Y

x y x . y F1 x + y F2
0 0 0 . 0 1 1 + 1 1
0 1 0 . 1 1 1 + 0 1
1 0 1 . 0 1 0 + 1 1
1 1 1 . 1 0 0 + 0 0

2_ xy = xy

F1 F2 x y x . y F1 x y F2 =
:. xy 1 1 1 . 1 0 0 0 0 = xy
1 0 1 . 0 1 0 1 0 = F1 = F2
0 1 0 . 1 1 1 0 0
3_ xy +xz = 0 0 0 . 0 1 1 1 1 (x+z) (x+y)

x y z xy + xz F1 (x+z) (x+y) F2
0 0 0 0 0 0 0 1 0
0 0 1 0 1 1 1 1 1
0 1 0 0 0 0 0 1 0
0 1 1 0 1 1 1 1 1
1 0 0 0 0 0 1 0 0
1 0 1 0 0 0 1 0 0
1 1 0 1 0 1 1 1 1
1 1 1 1 0 1 1 1 1
F1 F2 =
:. xy + xz = (x+z) (x+y)

6.3_ MINIMIZACION DE FUNCIONES DE BOOLE CON APLICAION DE


TEOREMAS.

2_ x + y xy + (x+y)xy
x+y + xy + xxy + xyy
x + y+xy
x(y+y)+ y(x+x)+xy
xy+xy+xy+xy+xy
xy+xy+xy+xy+xy
x(y+y)+x(y+y)
x+x
3_ (A+B+AB) (A+B) (AB)
(A+B+AB) (0B+A0) 4_
ABC+ABCD+AC
(A+B+AB) (0+0) ABC(D+D) +ABCD+AC
(A+B + AB) (0) ABCD+ABCD+ABCD+AC
0+0+0 ABCD+ABCD+AC
0 AC(1+BC+BD)
AC(1) = AC
7_ MINIMIZACION DE FUNCIONES DE BOOLE ATRAVES DE LOS MAPAS DE
KARNAUGH (PARA 2,3 Y VARIABLES)
7._ INTRODUCCION
Los mapas de KARNAUGH se utilizan para la minimización de funciones de
BOOLE. Estos mapas consisten en representar los valores tomados por una
función lógica en una tabla rectangular o cuadrara en la cual cada casilla
corresponde a una combinación distinta de las variables, esas casilla están
dispuestas de tal manera que las combinaciones asociadas a do casilla difieren
únicamente por el valor de una variable; en la practica pueden utilizarse llaves
que designan las casillas para las cuales c/variable toma el valor de 1.

0 2 6 4 ABC + ABC = AB(C+C) = AB


0 0 0 0 1 0 1 1 0 1 0 0 ABC+ABC=BC(A+A=BC)
1 3 7 5
0 0 1 0 1 1 1 1 1 1 0 1 Los mapas de KARNAUGH tienen
2n casillas en donde n es igual al numero de variables. Estos mapas pueden
dibujarse de la siguiente manera: mapas 2 variables.

A=0 A=1
A B A B
B=0 0 0 1 0
A B A B
B=1 0 1 1 1

Mapas para 3 variables (8casilla)


A=1
0 0 0 0 1 0 1 1 0 1 0 0
0 2 6 4
C=1 0 0 1 0 1 1 1 1 1 1 0 1
0 3 7 5

Mapas para cuatro variables (16 casillas)

A=1
0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0
0 4 12 8
0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1
1 5 13 9 D=1
0 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1
3 7 15 11
C=1 0 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0
2 6 14 10
B=1

Las relaciones de las variables que tiene el mapa KARNAUGH no tienen que ser
necesariamente las anteriores estas regiones se pueden determinar en otras
posiciones siguiendo las siguientes reglas:
a) Cada variable debe ocupar la mitad del total de las casillas del mapa.
b) Cada variable debe compartir la mitad de sus casillas con el resto de las variables.
C
1 0 1 1 9 8
1 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 A
1 4 1 5 1 3 1 2
B 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0
6 7 5 4
0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 0
2 3 1 0
0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0
D

Aun cuando las regiones en los mapas no tienen necesariamente una posición
fija; es muy conveniente en la minimización de funciones adaptar una posición
determinada con la finalidad de adquirir más rapidez en la solución de problemas.
Los mapas descritos al inicio de este objetivo son comúnmente usados y llamados
por algunos autores mapas estándar
Otra forma comúnmente utilizada para elaborar mapas de KARNAUGH es la
siguiente:

AB
C 00 01 11 10
A B C A B C A B C A B C
0 0 0 0 0 1 0 1 1 0 1 0 0
A B C A B C A B C A B C
1 0 0 1 0 1 1 1 1 1 1 0
Mapa para dos variables Mapa para tres variables
AB
CD 0 0 0 1 1 1 1 0
A B C D A B C D A B C D A B C D
0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0
A B C D A B C D A B C D A B C D
1 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1
A B C D A B C D A B C D A B C D
11 0 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1
A B C D A B C D A B C D A B C D
10 0 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0
Mapa para cuatro variables

Puede decirse que los mapas de KARNAUGH son una forma diagramática de la
tabla de verdad. Puesto que todas las combinaciones posibles de un grupo de
variables se encuentran contenidas en el mapa.
Con el objeto de agilizar la minimización de funciones las casillas de los mapas
que en este curso se utilizaran como estándar, que darían numeradas de la
siguiente forma.
7.1_ REPRESENTACION DE UNA FUNCION DE BOOLE EN UNA MAPA DE
KARNAUGH.
SUMA DE - Forma canónica F(A,B,C)= ABC+ABC+ABC
PRODUCTOS - Forma binaria F(A,B,C)= 001+011+110+100
1's - Forma técnica F(A,B,C) = Em (1,3,4,6)
FUNCIONES - Forma no canónica F(ABC)=ABC+AB+ABC+BC
DE BOOLE

PRODUCTO - Forma canónica F(ABC)=(A+B+C)(A+B+C)(A+B+C)(A+B+C)


DE SUMA - Forma binaria F(ABC)=(1+1+1)(1+0+1)(0+1+0)(1+0+1)
0's - Forma técnica F(ABC)= (0,2,3,4,5)
- Forma no canónica F(ABC)=(A+B)(A+B+C)(A+C)(A+B+C)

Por lo pronto solo se estudiarían las funciones que representan unos (1’s) en los
mapas.
Como ya se dijo anteriormente una función de BOOLE puede representar 1’s o 0’s
en un mapa; y esto puede realizarse de diversas formas, las cuales explicaremos
con los siguientes ejemplos:
Representar en un mapa la siguiente funcion:
F= ABC+ABC+ABC+ABC F=(x,y,z,w)= Em (0,3,5,6,7,11,13,15)
XY
ZW 00 01 11 10
A
00 1
1 1 1
01 1 1
C 1
7.2_ 11 1 1 1 1 ASOCIACION DE
B
1’s EN LOS 10 1 MAPAS
En un mapa de KARNAUGH se pueden asociar los 1’s que se encuentren en
casillas adyacentes o vecinas.
La adyacencia o vecindad entre dos casillas puede ser de manera vertical u
horizontal, y en términos generales se dice que 2 o mas casillas son adyacentes
si solo difieren en l valor de una variable.
.- Se pueden asociar 1’s en cantidades que provengan de 2 n.
.- Un 1 puede formar parte en más de una ocasión.
.- Debe asociarse siempre la mayor cantidad permitida de 1’s y no cometer
redundancias.
Ej:1) F=ABC+ABC+ABC+ABC+ABC

A FUNCION MINIMIZADA
F C + AB

1 1 1 1

C 1

B
2._ F= ABC+AC+BC+ABC

A FUNCION MINIMIZADA
F=AB+BC+AB
1 1
C 1 A 3._ F=BC+AB+BC+AC
1 1
1 FUNCION MINIMIZADA
B
1 F=B+C

C 1 1 1 1

4._ F(w,x,y,z)= Em(3,4,5,7,11,12,14,15)

WX FUNCION MINIMIZADA
F = yz YZ 00 01 11 10 + wxy + wxz

00 1 1

01 1

11 1 1 1 1

10 1

5._ f(X0,X1,X2,X3) = Em (0,2,10,11,12,14)


FUNCION MINIMIZADA
X2X3
X0X1
0 1 11 10 F= X0X1X3 + X0X1X2 + X0X1X2

0 1 1

1
6._
11
1
10 1 1
1
F=ABCD+ABC+ABCD+ABCD+ABCD+ABCD+ABCD

A FUNCION MINIMIZADA
F= CD+BD

1 1

C 1 1 1 1

1 1

7.3 ASOCIACION COMUN DE 1’s EN LOS MAPAS DE 3 VARIABLES

1.

1 1

2.

1 1

1
3.

1 1

1 1
4.

1 1
5.

1 1

1 1

7.4_ ASOCIACION COMUN DE 1’s EN LOS MAPAS DE 4 VARIABLES

1.
1 1

1 1

1 1

1 1

2.
1 1

1 1

3.

1 1 1 1

1 1 1 1

4.
1 1

1 1

1 1

5.

1 1 1 1
1 1 1 1

7.4_ PROBLEMAS PROPUESTOS


a) F(W,X,Y,Z) =Em (3,4,5,7,11,12,14,15)
b) F=ABCD+ABC+ABCD+ABCD+ABCD+ABCD
c) F= ABCD+ABCD+ABCD+ABC+ABCD+ABCD+ACD+ABCD
d) F(K,L,M,N) = Em (0,4,6,10,11,13)
e) F=ABCD+ABCD+ABCD+ABCD+ABCD+ABCD+ABCD
f) F(A,B,C,D)= Em (1,5,6,7,11,12,13,15)
g) F(X,Y,Z,W)= Em (0,1,2,4,5,8,10)

8._ FUNCION LOGICAS

0 0 VOLTIOS (TEORICO) PRACTICO 0 a 1.2V


1 3.6 VOLTIOS (RIORICO) PRACTICO 3.6 a 9V
8.1._ COMPUERTAS
8.1.1 COMPUERTAS BASICAS

NOT (NO)
AND (Y)
OR (Ó)

8.1.2 COMPUERTAS NO BASICAS

NAND
MOR
OR EXCLUSIVO

8.1.3 OPERACIÓN DE LAS COMPUERTAS BASICAS

NOT
SIMBOLO OPERACIÓN (INVERTIDO COMPLEMENTAR)
TABLA DE VERDAD
X F=X
0 1

1 0
AND
SIMBOLO
OPERACIÓN (MULTIPLICACION)
TALA DE VERDAD
A B F = A.B
0 0 0
0 1 0
1 0 0
1 1 1

OR
SIMBOLO OPERACIÓN (SUMA)
TABLA DE VERDAD

A B F= A+B
+ + 0 0 0
0 1 1
1 0 1
1 1 1

8.1.4 OPERACIONDE LA COMPUERTAS NO BASICAS

NAND
SIMBOLO OPERACION (MULTIPLICACION Y COMPLEMENTA)
COMPLEMENTA EL PRODUCTO
TABLA DE VERDAD
A B F= AB
0 0 1
0 1 1
1 0 1
1 1 0

NOR
SIMBOLO

OPERACIÓN: SUMA Y COMPLEMENTA


(COMPLEMENTA LA SUMA)
TABLA DE VERDAD
A B F = A+B
0 0 1
0 1 0
1 0 0
1 1 0

OR EXCLUSIVO (XOR)
SIMBOLO
OPERACIÓN: SACA UN (1) CUANDO EXCLUSIVAMENTE UNA
DE SUS ENTRADAS ES UN (1)
TABLA DE VERDAD
A B F = AB+ AB
0 0 0
0 1 1
1 0 1
1 1 0
8.1.3. IMPLEMENTACION DE FUNCIONES DE BOOLE
Implementar una función de BOOLE es llenarla a la practica por medio de
un circuito que puede ser electrónico hidráulico, neumático o electrónico a
base de compuertas lógicas.
Ej. Implementar la sig. Función por medio de compuertas lógicas
1._ F= X0 X1 X3 + X0 X1 X3 + X0 X1 X2

2._ IMPLEMENTAR LA SIGUIENTE FUNCION


F= YZ + XWZ + XYW

3._ IMPLEMENTAR LA SIGUIENTE FUNCION CON LAS RESTRICCIONES


INICIALES 2 SALIDAS.
3_ F= (A+D) (A+B)(B+D)(A+B+C)
4_ IMPLEMENTAR LA SIGUIENTE FUNCION CON COMPUERTAS OR Y NOT
F= A B C = A+B+C

5_ IMPLEMENTAR LA SIGUIENTE FUNCION CON COMPUERTAS AND Y NOT


F= (X+Y+Z) (X+Y+Z)= XYZ+ XYZ

6_ Se tienen 2 números de 2 bits cada uno: a que estará formado por A1 A0 y B


que estará formado por B1 B0 diseñe un circuito que indique con un uno”1”
cuando se cumpla cada una de las siguientes condiciones:
a) Que A =B
b) Que A< B
c) Que A> B
A1A0
B1B0 00 01 11 10
00 1
01 1
11 1
10 1
A=B F=Em (0,5,10,15)
F= A+A0B1B0+A1A0B1B0+A1A0B1B0+A1A0B1B0

A1A0
B1B0 00 01 11 10
00
01 1
11 1 1
10 1 1
A<B F= Em (1,2,3,6,7,11)
F= A1B1+A0B1B0+A1A0B0

A1A0
B1B0 00 01 11 10
00 1 1 1
01 1 1
11
10 1
A>B F= Em (4,8,9,12,13,14)
F= A1 B1+ A0 B1 B0 + A1 A0 B0
DISEÑAR UN GENERADOR DE PARIDAD PAR Y OTRP GENERADOR DE
PARTIDA IMPAR, PARA 4 BITS tomando en consideración la serie de unos o que
integran c/series de bits y haga que el cuanto corra en una sola salida.
F(A,B,C,D) = (1,2,4,6,7,8,9,11,12,14)
= (1,2,3,4,6,7,8,9,11,12,13,14)

AB
CD 00 01 11 10

00 1 1
01 1 1 1
11 1 1
10 1 1 1

F= AC+D+ABD+ABC+ACD+BCD
AB
CD 00 01 11 10
00 1 1
01 1 1 1
11 1 1 1
10 1 1
F= AC+AC+BD+BD
F= (A,B,C,D)=(0,3,5,10,15)
F(A,B,C,D)=(0,5,10,15)
AB
F=ABCD+ABCD+ABC+BCD CD 00 01 11 10
00 1
01 1
11 1 1
10 1
F=ABCD+ABCD+ABCD+ABCD+ABCD

PROBLEMAS PROPUESTOS
1._ Se desea minimizar para luego implementar con compuertas lógicas básicas
las siguientes BOOLEANAS:
a) ABCD+ ABCD +ABCD + ABCD + ABCD + ABCD+ ABCD
b) F(K,L,M,N)=Em (0,4,6,10,11,13)
c) F(A,B,C,D)= Em (0,1,3,5,7,9,11,13,15)
d) F(X0,X1,X2,X3)=Em(1,4,5,8,9,11,12,14,15)
e) F= ABC + ABC + ABC + ABC + ABC + ABC + ABCD
2._ Diseñar un circuito detector de números primos (que reconozca los números
primos con un cero)
3._ Diseñe un circuito detector de números pares y nomes (pares con 0’s y nomes
con 1’s)
9._ INTERPRETAR DE LOS TEOREMAS DE LOS MINITERMINOS Y
MAXTERMINOS
A parir de la siguiente tabla de verdad obtenga la siguiente función; una con
minitérminos (1’s) y otra con maxtérminos (0’s)

X Y Z F MINITERMINOS MAXTERMINOS
0 0 0 0 0 X+Y+Z
1 0 0 1 1 X Y Z
2 0 1 0 0 X+Y+Z
3 0 1 1 0 X+Y+Z
4 1 0 0 1 X Y Z
5 1 0 1 0 X+Y+Z
6 1 1 0 1 X Y Z
7 1 1 1 0 X+Y+Z

:. Fmin = XYZ+XYZ+XYZ F(X,Y,Z)=Em (1,4,6)


Fmax = (X+Y+Z) (X+Y+Z) (X+Y+Z) (X+Y+Z) (X+Y+Z)= (0,2,3,5,7)
NOTAS:
1._ Breve explicación de los minitérminos:
Cada ves que la función tome un (1’s) se formara un termino que es el
producto de las variables de que consta la función; complementando las
variables que en esa connimacion valgan 0’s y dejando tal cual las variables
que valgan 1’s
2._ Breve explicación de los maxtérninos:
Cada vez que la función tome el valor de 0’s se formara un maxtérmino, el cual
será la suma de las variables que consta la función; complementando todas
las variable que en esa combinación valgan 1’s. la función maxtérminos se
formara del producto de todas las sumas obtenidas.
xy
z 00 01 11 10 Fmin = xz + xyz
0 1 1
xy
z 1 00 1 01 11 10 Fmax = (x+z) (x+z) (x+y)
0 0 0
1 0 0 0

Maximizar con maxtérminos lo siguiente función


F= (A+B+C) (A+B+C+D) (A+B+C+D) (A+B+C+D) (A+B+C+D) (A+B+C)
1 2 3 4 5 6
AB0
CD 00 01 11 10 Fmax
00 0 1 1 0 M= (C+D)(B+C)
01 0 1 1 0
11 0 0 0 0 Fmin = CD +BC
10 1 1 1 1
Ej_ Función (A,B,C,D) =
(1,3,4,5,6,7,8,9,13,15)
AB
CD 00 01 11 10 Función M= (A+D)(B+D)(A+B)(A+B+C)
00 0 0
01 0 0 0 0
11 0 0 0
10 0

Ej. F(XYZW)= (0,2,8,12,13)

X Fmin M= (X+YW)(Y+Z+W)(X+Y+Z)
00 01 11 10
00 0 0 0
01 0 W
11 Z PROBLEMAS:
10 0 De las siguientes funciones obtenga
Y los maxitérminos y los minitérminos
primero obtenga los maxitérminos y
luego los minitérminos:
a) F(A,B,C,D)= M(0,2,6,10,14,15,9,1)
b) F(X,Y,Z,W)= M(1,4,6,5,2,14,12,10,15)
c) F(A,B,C,D)= M(2,6,8,9,10,11,13,14,15)
d) F(X,Y,Z,W)= M(3,4,5,9,14,15,11,10,7)

10._IMPLEMENTACION DE FUNCIONES UTILIZANDO SOLO COMPUERTAS


NAND O SOLO COMPUERTAS NOR
10.1_ FORMULAS PARA IMPLEMENTAR CON NAND
SIMBOLO ALGEBRAICO NAND /
a) X= X/1

b) X.Y.Z =(X/Y/Z)/1

c) X+Y+Z=(X/1)(Y/1)(Z/1) Ó (X/Y/Z)

d) SUMA DE PRODUCTOS AB+CDE+F= (A/B)/(C/D/E)/F


e) PRODUCTO DE SUMAS (A+B)(C+D+E)(F)= (A/B)(C/D/E)/F/1

PROBLEMAS PROPUESTOS:
1._ Implementar con NAND’S
F=BD+BC+ABCD=(B/D)/(B/C)/(A/B/C/D)

2._ Implementar con NAND’S la siguiente función


F=(X+Z)(X+Y)(Y+W) = (X/Z)/(X/Y)(Y/W) /1

3._ Implementar con NAND’S la siguiente función:


F= (A+B+C+D)(B+D)(B+C) = (A/B/C/D)(B/D)(B/C)/1
10.2_ FORMULAS PARA IMPLEMENTAR CON NOR’S
SIMBOLO ALGEBRAICO

a) A = A 0 ó A A

b) MULTIPLICACION
ABC = A B C

c) SUMA
A+B+C= (A+B+C) 0

d) SUMA DE PRODUCTOS
AB+CDE+F= (A B)( C D E ) F 0

e) PRODUCTO DE SUMAS
(A+B)(C+D+E)(F)(A B)(C D E ) F
PROBLEMAS PROPUESTOS:
a) Los 2 ejercicios efectuados anteriormente con NAND ahora realícelos con
NOR (aplicar las formulas dadas)
b) Realizar llos siguientes problemas con compuertas NAN’S y NOR’S

b.1_ F= A B C D
b.2_ F= A+B+C+D
b.3_ F= ABC+ ABC+ BC+ AC
b.4_ F=(A+B)(B+C+D)(D+E)
b.5_ F=AB+A+D+ABC+E

11._ MINIMIZACION DE FUNCIONESDE 5 VARIABLES CON MAPAS DE


KARNAUGH.
El mapa de cinco variables que usaremos en este curso estar estructurado
de la siguiente forma.
A=0 A
B
16 20 28 24
17 21 29 25 E
D 19 23 31 27
18 22 30 26
C

A=0 A=1
BC
DE 00 01 11 10
La adyacencia en este caso puede se da 00 10000 10100 11100 11000
dos formas en cada mapa y entre mapas. 01 10001 10101 11101 11001
En cada mapa seria igual que en mapas
11 10011 10111 11111 11011
de 4 variables; entre mapas la
10 10010 10110 11110 11010
adyacencia puede determinarse de
manera rápida y sencilla imaginándonos que uno de los 2 mapas es todo y
colocado sobre el otro, y las casillas que queden encima son adyacente o vecinas
por ejemplo la casilla 0-16,1-17 ,11-27,8-24, etc todas las reglas aplicadas para
los mapas de cuatro variables son validas a las de n variables. Debe notarse que
mapa de 5 variables no es mas que una de 4 repetida 2 veces.
1_ Ej minimizar en mapas de KARNAUG la siguiente función:
F(x,y,z,w,v)= Em(1,3,4,5,7,8,9,10,12,13,21,24,25,26,28,29)
yz
wv 00 01 11 10
00 1 1
01 1 1 1
11
10 1

F = Em(I,II,II,IV,V)
I=YW
II= Y Z V
III= Z W V
IV=X W
V= X Y V
2._ F= ACDE+ABCDE+BCDE+ACD+ABCD+ABCD+ABCDE+ABCDE+ACDC+ABCDE

A=0 A=B
BC
DE 00 01 11 10 0 1 11 10
00 1 1 1 0 1 1 1
01 1 1 1
11 1 1 1 11 1 I=BE
10 1 1 1 10 1 1 1
II=CE
III=ABD
IV=BCD
V=BCDE

TRABAJO
1._ F(XYZWV)=Em(0,4,6,8,9,10,13,14,15,17,23,26,29,30)
2._ F(A,B,C,D,E)=Em (1,6,10,14,15,20,23,24,27,30,31)
3._ F=ABCD+ABC+ABCD+BCDE+CDE+ACDE
4._ F=ACD+ABCD+ABCD+ABC+BCDE+ABCDE+CDE
5._ F= ACDE+ABCD+ABCD+ABC+ABCDE+ABCDE+d(ABC+ACD+ABCD+ABCDE+ABCDE
FUNCIONES IMCOMPLETAS ESPECIFICADAS:

00 01 11 10
0 1 1
1 1 1
= F= PQ+PA

00 01 11 10
0 1 X
1 1 1 X

EXPRESIONES TECNICA
F(P,A,Q)=Em(1,2,3)+d(6,7)
Obtener la realización mínima de suma de productos de la
F=(A,B,C,D,E)=Emin(1,2,3,4,5,11,18,19,20,21,22,23,31)+d(0,1,2,15,27,30)
A=0 A=1
00 01 11 10
00 1
01 1
11 1 1 1 X
10 1 1 X

F= ABC+BDE+BCD+ABD

UNIDAD III
3._ CIRCUITOS DE SALIDA MULTIPLES, CONTADORES EMPAQUETADOS Y
EXHIBIDORES CON 7 SEGMENTOS (DISPLAY).
3.1._ CIRCUITOS DE SALIDA MULTIPLE:
a) CIRCUITO DE SALIDA UNICA

b) CIRCUITO DE SALIDA MULTIPLE

-SALIDA UNICA
-COMBINACIONALES -SALIDA MULTIPLE
c) CIRCUITO LOGICOS
-SECUENCIALES

CIRCUITO DE SALIDA MULTIPLE

CAPÍTULO III.

ÁRBOLES BINARIOS

En la vida cotidiana, muchas vedes sin saberlo, trabajamos en ocasiones con los
árboles. Por ejemplo: árboles genealógicos, organigramas, directorios en los
discos de un computador, etc. Cada uno de estos conceptos representa un árbol.
ORGANIGRAMA DE UNA EMPRESA

ORGANIZACIOND E UN DIRECTORIO EN UN COMPUTADOR

3.1.DEFINICIONES

En el área de la computación también se conoce una materia que trata de los


árboles. Este tema es muy extenso y para su estudio vamos a dividirlo en varios
capítulos.
En este capitulo nos vamos a circunscribir solamente en el estudio de los árboles
binarios. Este tipo de árbol se caracteriza porque tiene un vértice principal y de él
se desprende dos ramas. La rama izquierda y la rama derecha.

La rama izquierda y la derecha, también son dos árboles binarios. El vértice


principal se denomina raíz y cada una de las ramas se denomina árbol izquierdo y
árbol derecho. Por ejemplo:
La raíz de este árbol es A y el árbol izquierdo esta conformado por otro árbol.

Que a su vez tiene como raíz B. el árbol derecho esta conformado también por
otro árbol.

DEFINICIONES

NODO
Un árbol binario es un conjunto de elementos cada uno de los cuales se
denomina nodo. Un árbol binario puede tener cero nodos y en este se dice que
esta vació. Puede tener un solo nodo, y en este caso existe solamente la raíz del
árbol o puede tener un número finito de nodos. Cada nodo que esta ramificado
por la izquierda o por la derecha o puede no tener ninguna ramificación. La
anatomía de un nodo en un árbol binario es la siguiente:

O Información del nodo

Apuntador al árbol de la derecha


Apuntador al árbol de la izquierda O O

Raíz en un árbol binario se pueden distinguir la raíz principal y las raíces de los
demás subárboles. Por ejemplo:
La raíz principal es el nodo cuya información es A. podemos distinguir también el
árbol.

Cuya raíz es el nodo con información D. Este nodo es la raíz del árbol de la
derecha. El Árbol de la izquierda

Tiene como raíz el nodo cuya información es B y tiene solamente una


ramificación.
PADRE
Un padre es un nodo que puede o no tener ramificaciones. Por ejemplo:

Caso 1 caso 2 caso3

En los tres casos el nodo A es un padre. En el caso 1 es un padre que no tiene


hijos. En el caso 2, el nodo A es el padre del nodo B. en el caso 3 el nodo A es
padre de los nodos By C peo no es padre del nodo D.

HIJO
Nos referimos al ejemplo anterior. En el caso 1 el nodo A no tiene hijos. En el caso
2, B es un hijo del nodo A y en el caso 3, D es hijo de B y el padre de B es el nodo
A
HERMANO
Nos referimos al caso 3 del ejemplo anterior. Los hermanos son los hijos de un
mismo padre. Los nodos B y C son hermanos. El nodo D no tiene hermanos
HOJA
Una hoja es un nodo que no tiene ramificaciones. Por ejemplo
El nodo C es una hoja mientras que el nodo B no se puede considerar como hoja
porque tiene una ramificación por la derecha. El nodo D también es una hoja
NODO NO TERMINAL
Un nodo no Terminal es aquel que posee por lo menos una ramificación. En el
ejemplo anterior, el nodo A o el B son nodos no terminales, mientras el nodo D o
el nodo C son nodos terminales.
CAMINO
Un árbol siempre se examina hacia abajo. Por ejemplo:

Al nodo C podemos llegar desde el nodo B. Nunca se puede examinar el nodo B a


partir del nodo C. Los apuntadores derecho o izquierdo de cualquier nodo apuntan
al árbol derecho o izquierdo que siguen a ese nodo. Nunca apuntan a los nodos
precedentes. Un camino es el conjunto de nodos que tenemos que visitar con el
propósito de llegar a un nodo específico. Por ejemplo para llegar al nodo F es
necesario recorrer el camino
A D F
Del mismo nodo, para llegar al nodo G debemos recorrer el camino
A D E G
Obsérvese que los caminos se configuran siempre hacia abajo. Nunca se puede
hablar de un camino para llegar al nodo C así:
G E D A B C
Este camino se puede configurar.
LONGITUD
Longitud es el número de nodos que se deben recorrer para pasar de un nodo a
otro. Por ejemplo:
A

B
G

C E D F
La longitud entre A y E es 3. La longitud entre G y G es 0. La longitud entre A y B
es 1 Obsérvese que no podemos calcular la longitud entre B y G ya que el camino
B A G no existe.
DESCENDIENTE
El nodo C es descendiente del nodo A si a partir de A podemos llegar a C a través
de un camino. Por ejemplo:
El nodo C es descendiente de A ya que a C podemos llagar por el camino
A B C
Siempre que exista un camino para llegar de un nodo V a un nodo X, el nodo X es
un descendiente de V. pAra el ejemplo anterior, el nodo E es descendiente de D
pero el nodo no es descendiente de B
ANCESTRO
El nodo A es un ancestro del nodo C si existe un camino entre A y C. basándonos
en el ejemplo anterior. A es un ancestro de C ya que existe un camino entre los
nodos. No se puede hablar de que D sea ancestro de ya que el camino D A
B no existe
NIVEL
Cada nodo tiene un nivel dentro de un árbol binario. Por definición el nodo raíz
tiene un nivel y de los demás nodos tienen el nivel de su padre más 1. Por esto
los nodos que son hijos del nodo raíz tienen un nivel 1. Veamos este ejemplo

A M

B E N O

C D F P

G
S

NIVEL 0 T
NIVEL 1 W
NIVEL 2
NIVEL 3

Los nodos A, M y S tienen un nivel 0 en tanto que los nodos G y V tienen un nivel
3. Obsérvese que le nivel del nodo G es la longitud del camino desde la raíz hasta
el nodo.
GRADO DE UN NODO
El grado de un nodo es el número de hijos. Por ejemplo el grado del nodo A es 2,
el grado del nodo T es 1. El grado de un nodo Terminal siempre es 0.en los
árboles binarios, el grado de un nodo fluctúa entre 0 y 2. Existen otros tipos de
árboles, (árbol n_ario), en los cuales esta restricción no existe. Estos arboles
serán estudiados en el segundo tomo de este libro
ALTURA
La altura de un árbol binario es el nivel de la hoja o de las hojas que están más
distantes de la raíz. Basándonos en el ejemplo anterior, la altura del árbol cuya
raíz es A, corresponde a la longitud del camino para llegar a la hoja más distante
de la raíz. En este caso será 3. La altura cuya raíz es M, corresponde al nivel de
la hoja P.
ARBOL BINARIO COMPLETO
Un árbol binario completo es aquel en el que todo nodo no Terminal tiene sus dos
hijos. El siguiente es un árbol binario de nivel 3:
NIVEL 0
A NIVEL 1

D C F B G E H K J L I N M O
NIVEL 2
NIVEL 3

Obsérvese que todos los nodos no terminales tienen sus dos hijos. El máximo
número de nodos que puede tener un árbol de nivel n es:
20 + 21 + 22 + 23….+ 2n
Si n es 3 entonces
20 + 21 + 22 + 23 =15
Este árbol es un árbol binario completo de nivel 3 y este es el máximo número de
nodos que puede tener un árbol de nivel 3.
ARBOL BINARIO IGUAL
Dos árboles son iguales si los dos son vacíos. Existe otro caso ene. Cual dos
árboles son iguales:

A A

B C B C

D D

Estos árboles son iguales porque sus raíces son iguales y también lo son su
respectivo árbol izquierdo y derecho. Para que un árbol sea igual a otro, es
necesario que el contenido de cada uno de sus respectivos nodos sea el mismo y
que legan las mismas relaciones de parentesco. Por ejemplo los siguientes
árboles
A A B

B C B E A F

D D D

Son diferentes porque el contenido de sus respectivos nodos es diferente.


Obsérvese que sus nodos tienen las mismas relaciones de parentesco.
ARBOL BINARIO SEMEJANTE
Dos árboles son semejantes si tienen el mismo número de nodos y los valores de
los nodos del primer árbol son los mismos que los valores de los nodos del
segundo, sin importar la relación de parentesco entre ellos. Por ejemplo:

A B C
C

B C A B A
A

Estos árboles son semejantes. Contienen


C los mismos valores enBcada uno de sus
nodos.
ARBOL BINARIO ISOMORFO
Dos árboles binarios son isomorfos si tienen la misma estructura aunque el
contenido de cada uno e sus nodos sea diferente. Por ejemplo los siguientes
árboles son isomorfos.

A
A

B C
B C

G
F E F
D E

D H
PESO
El peso de un árbol en un nodo dado es el número de nodos en el árbol sin
contarse el mismo. Por ejemplo:

A P

B C Q
R

D E S T U V

El peso del árbol cuya raíz es A corresponde al número de nodos de ese árbol: los
nodos Q,C y R tienen un peso de 2
FORMAS DE RECORRER UN ARBOL BINARIO
Universalmente existen 3 formas de recorrer un árbol binario:
 Preorden
 Inorden
 Posorden
Si logramos construir un árbol como este:
Podemos extraer sus datos de 3 maneras. Veamos cada una. Recorrer un árbol
en preorden consiste en:
 Examinar el ato del nodo raíz
 Recorrer el árbol izquierdo en preorden
 Recorrer el árbol derecho en preorden
Si deseamos recorrer todo el árbol, evidentemente debemos comenzar por el
nodo raíz. Este método exige examinar primero el nodo raíz debemos entender
como examinar un nodo, el hecho de efectuar sobre su información cualquier
acción: por ejemplo escribirla, efectuar alguna operación matemática sobre ella o
con ella, modificarla. También en la gran mayoría de los textos de estructuras de
información, se utiliza el termino visitar un nodo. Entre la palabra examinar y la
palabra visitar existe una diferencia. Examinar un nodo es revisar su contenido y
eventualmente modificarlo en tanto que visitar un nodo es utilizar la dirección de
ese nodo con el propósito de seguir explorando el árbol hacia abajo. Si deseamos
recorrer un árbol en preorden, con el propósito de escribir su contenido, debemos
examinar el contenido de cada uno se sus nodos, mientras si deseamos contar
sus nodos, es necesario visitar cada nodo.
Supongamos que deseamos escribir un árbol en preorden. Para hacerlo, se debe
examinar el nodo raíz y luego recorrer el árbol de la izquierda en preorden.

E
D
ARBOL A LA IZQUIERDA DE A
Recorrer este árbol en preorden es examinar su nodo raíz y recorrer de nuevo el
árbol de la izquierda preorden.

D
ARBOL A LA IZQUIERDA DE B
Recorrer este árbol en preorden es examinar su nodo raíz. Como ya no existen
nodos por la izquierda, debemos empezar a recorrer el árbol D por la derecha.
Como ya no existen nodos por la derecha, debemos recorrer el árbol.

E
D
Por la derecha. El árbol de la derecha lo debemos recorrer también en preorden.

E
ARBOL A LA DERECHA DE B
Recorrer este árbol en preorden, es examinar su nodo raíz y recorrer el árbol por
la izquierda en preorden y luego recorrerlo por la derecha. Como no existen
árboles ni por la izquierda ni por la derecha, debemos recorrer el árbol.

F G
En preorden. El orden en el cual debemos examinar estos nodos es: primero el
nodo C, luego F y luego G. por lo tanto al imprimir el árbol anterior en preorden,
los resultados deben ser:
A B D E C F G
Antes de seguir adelante, el lector debe certificar que el árbol:

1
0

5 1
5

3 1
7 4 1
7

Al imprimirlo recorriéndolo en Preorden debe generar los siguientes resultados:


1 4 99 1 2
10 5 3 1 4 7 15 14 17 6 16 20 0
B
Ahora veamos la segunda forma de recorrer un árbol binario. Recorrer un árbol en
inorden, consiste en:
Recorrer el árbol izquierdo en inorden
Examinar la raíz
Recorrer el árbol derecho en inorden.
Por ejemplo:

B C
Si queremos imprimir este árbol en inorden, debemos primero recorrer el árbol
izquierdo en inorden:
Al tratar de recorrer este árbol en inorden y no existe árbol por su izquierda
debemos examinar el nodo y luego recorrer el árbol de su derecha. Al no existir
árbol por su derecha, entonces el árbol a la izquierda del nodo A ha sido
totalmente recorrido. Siguiendo con las normas establecidas inicialmente,
debemos examinar el nodo A y luego recorrer el árbol a la derecha del nodo A

C
ARBOL DERECHO DE A
Para recorrer este árbol en inorden primero debemos recorrer el árbol izquierdo.
Al no existir árbol izquierdo, se debe examinar este nodo y luego recorrer el árbol
derecho. Al no existir árbol derecho, el árbol ya ha sido recorrido en su totalidad.
Por lo tanto los datos impresos serán:
B A C
Observemos este otro ejemplo

1
0

5
1
2

3 7 1 1
Debemos recorrer en inorden el árbol a la izquierda
1 de la5raíz:

3 7

Al recorrer este árbol en inorden ya sabemos, de acuerdo a la explicación del


ejemplo anterior, que los resultados son:
3 5 7
Al terminar de recorrer el árbol a la izquierda de la raíz, debemos examinar la raíz
y luego recorrer en inorden el árbol a la derecha de la raíz

1
2

1 1
1 5
Sabemos que al recorrer este árbol en inorden, los resultados son:
11 12 15
Con lo cual al examinar todo el árbol en inorden, los datos impresos serán:
3 5 7 10 11 12 15
Se invita al lector a certificar que al recorrer el siguiente árbol binario en inorden
los resultados son:
H D I B E A J F C K G L
Veamos el árbol

B C

D E F G

I J L
H K

Por ultimo estudiemos la tercera forma de recorrer un árbol binario. Examinar un

árbol binario en posorden consiste en:

 Recorrer el árbol izquierdo posorden

 Recorrer el árbol derecho en posorden

 Examinar la raíz.

Veamos un ejemplo:

B C

Al recorrer el árbol izquierdo en posorden, el único dato impreso será B. después

de haber recorrido todo el árbol de la izquierda en posorden, se debe recorrer

todo el árbol de la derecha en posorden. Al recorrer el árbol de la derecha en

posorden, el único dato impreso será C. una vez recorridos los árboles izquierdo y

derecho, debemos examinar la raíz. Según esto los datos impresos serán.
B C A

Ejercicios
1. Elaborar un programa que cree en la memoria del computador el siguiente
árbol binario:

B C

D E

2. Dado el siguiente árbol binario:

B C

D E

F G I J

Certificar que al recorrer el árbol, los siguientes resultados son correctos:

Preorden ABCDFGEIJ

Inorden BAFDGCIEJ

Posorden BFGDIJECA

3. Suponga que en memorial del computador existe el siguiente árbol:

B C
D
E

Escriba un conjunto de instrucciones que cree un nodo X a la derecha de B y un


nodo Y a la derecha de E.
4. dado el siguiente árbol: raíz

R
Q

U V
S T

W X Y
Z

Cuales serian los datos impresos si se recorre en:


Preorden
Inorden
Posorden

MANTENIMIENTO DE UN CONJUNTO DE NUMEROS CLASIFICADOS


ASCENDENTEMENTE, UTILIZANDO UN ARBOL BINARIO ORDENADO.
Utilizando un árbol binario, es posible mantener un conjunto de números
clasificados ascendentemente sin necesidad de rutinas de ordenamiento. Se
plantea el problema de leer un conjunto de enteros y listarlos clasificados
ascendentemente.
Los números repetidos deben ser rechazados. Por ejemplo si la entrada es:
87 25 23 25 48 8 92
El programa debe generar los siguientes resultados:
8 23 25 48 87 92

Este problema se puede resolver fácilmente utilizando un árbol binario ordenado.


Solamente es necesario ir leyendo cifra por cifra e ir adicionándola en el árbol así:
si es menor al contenido del nodo analizado la instemos por la izquierda de ese
nodo y se es mayor por la derecha. Veamos: al leer el número 87, creamos con
este dato el nodo raíz. Luego al leer el 25, como 25 es menor que 87, creamos un
nuevo nodo a la izquierda de 87. Visualmente el árbol creado hasta el momento
sería:

8
7

2
5
Luego al leer el número 23, como este dato es menor a 87, nos debemos
desplazar hacia abajo por la izquierda. Al llegar al 25, debemos crear un nuevo
nodo a la izquierda por el hecho de que 23 es menor que 25, así:

8
7

2
5

2
3
Al leer el siguiente dato este debe ser rechazado porque ya existe en el árbol. Al
leer el 48, debemos desplazarnos por la izquierda y al compararlo con 25, se
debe crear un nuevo nodo a la derecha del 25, así:
8
7
2
5

2 4
3 8

Siguiendo este mismo procedimiento, enumero 8 debe insertarse a la izquierda


del 23 así

8
7

2
5

2 4
3 8

Por ultimo al leer el numero 92 este debe insertarse a la derecha del 87. Los
datos en el. Árbol quedan, finalmente, distribuidos así:

8
7

9
2 2
5

2 4
3 8

8
Si imprimimos el contenido del árbol, recorriéndolo en inorden. Tendremos la lista
pedida:

8 23 25 48 87 92
IMPRESIÓN DE UN ARBOL EN INORDEN
Observemos el siguiente árbol:
Raíz

1
0

5
1
5

3 7 2
0
Al escribir este árbol en inorden los resultados serán:

3 5 6 7 8 10 15 20
Observando el proceso, lo primero que se escribe siempre es el contenido del
nodo de la extrema izquierda del árbol. Luego debemos escribir el contenido del
nodo padre para luego escribir en inorden el árbol de la derecha.

IMPRESIÓN DE UN ARBOL EN PREORDEN USANDO UNA PILA

Deseamos escribir un árbol en preorden. Veamos esta estructura:

R 10
0

A 5
0 15 G
0

3
0 6 12
0 0 16
1 4 6 18
0
B I
E

D F J

La función que vamos a elaborar debe escribir:


100 50 30 10 40 60 65 150 120 160 180
Esta nueva función se diferencia de a función inorden ( ), en que en aquella
primero se recorría el árbol izquierdo y luego si se escribía el contenido del padre
de ese árbol. En esta nueva rutina primero se debe escribir el contenido del padre
del árbol y luego se recorrer en preorden la rama izquierda.
El siguiente paso consiste en retirar de la pila la dirección C y determinar si existe
un árbol por la derecha del nodo indicado por C. siguiendo el comportamiento de
la pila, podemos por esto, deducir que esta función es muy parecida a la función
inorden ( ). La diferencia radica en que antes de analizar el árbol izquierdo, la
información del nodo ya ha sido escrita. Veamos el comportamiento del proceso:

Contenido la pila numero escrito


100
1 R

50
2 R A

3 R A B
30

3 R A B C 10

3 R A B
-

2 R A
-

3 R A D 40

2 R A
-

2 R E 60

3 R E F 65

2 R E -
1 R -

1 G 150

2 G H 120

1 I -

1 J 180
0
-

IMPRESIÓN DE UN ARBOL EN POSORDEN USANSO UNA PILA


La impresión de un árbol en posorden, es un poco más compleja y requiere de
modificaciones en el manejo de la pila Veamos este árbol:

1
0

5
3
0

3 7 2 4
0 0
La impresión en posorden es:

3 7 5 20 40 30 10

Antes de imprimir el nodo, debemos recorrer el árbol izquierdo y luego el derecho.


Es claro que primero debemos llegar hasta la hoja de la extrema izquierda del
árbol, guardando los apuntes en una pila para luego poder recuperar las
direcciones de todos los ancestros de esa hoja. Se llegamos a la hoja:

3
Antes de escribir el contenido del nodo debemos certificar que ya han sido
recorridos en posorden los árboles izquierdo y derecho.

IMPRESIÓN DE UN ARBOL POR NIVELES USANDO UNA COLA


Imprimir un árbol por niveles, es imprimir primero su raíz, luego los contenidos de
los nodos del nivel 1, luego los contenidos de los nodos del nivel 2, y así
sucesivamente hasta imprimir el contenido de los nodos del ultimo nivel. Por
ejemplo:
2
0

1
0 3
0

5 1 2 4
7 5 5 0 5
Al imprimir este árbol por niveles, los resultados serán:
20 10 30 5 15 25 40 7 50
Aprovechando una estructura FIFO, podemos efectuar esta impresión sin ningún
problema.
Al comenzar almacenamos en una cola la dirección del nodo raíz:

Ahora mientras la cola no este vacía, retiramos el primer elemento de la cola y


escribimos el contenido de la dirección del elemento retirado e insertamos en la
cola las direcciones izquierda y derecha almacenadas en el contenido de la
dirección retirada de la cola

B C

Siguiendo este mismo procedimiento, tendríamos los siguientes estados de la


cola:

10 C D E

30 D E F G

5 E F G H

F G H
15

G H
25

40 H I

7 I

50 H

Revisando el proceso anterior, observamos dos cosas: la primera es que cuando


un apuntador es NULL, a la cola no se adiciona ningún elemento y la segunda es
que este proceso repetitivo se debe efectuar mientras la cola no esté vacía.
RECONSTRUCCION DE UNA RBOL BINARIO
Se plantea el problema de reconstruir un árbol binario dados sus recorridos en
preorden y en inorden. Por ejemplo, si un árbol genera lo siguiente: al recorrerse
en preorden:
G E A I B M C L D F K J H
Y genera lo siguiente al recorrerse en inorden:
I A B E G L D C F M K H J
Se requiere de un programa que a partir de estos datos, genere un árbol binario al
cual correspondan las dos impresiones. Vamos a considerar que a la función que
elabora este trabajo entran dos arreglos. El método es muy sencillo y consiste en
utilizar una estructura LIFO como la herramienta fundamental. Lo más sencillo del
proceso es determinar la raíz del árbol. Para el caso que nos ocupa la raíz será:

Vamos a utilizar los apuntadores p y q como auxiliares de trabajo.

Pre G E A I B M C L D F K J H
In I A B E G L D C F M K H J
Si se recorre este árbol en Preorden, el primer nodo que visita es G y al recorrerlo
en inorden el nodo del extremo izquierdo es I. en este lugar podemos afirmar que
los nodos EAIB, forman el sub.-árbol izquierdo de G y los nodos MCLDFKJH el
sub.-árbol derecho q

Raíz p
G

EAIB MCLDFKJH
IABE LDCFMKHJ
El problema esta dividido en dos. Ya sabemos que la raíz es G y también
sabemos los componentes de la izquierda y de la derecha. Ahora podemos
guardar en una pila los componentes del árbol derecho y seguir trabajando sobre
el árbol izquierdo. Es decir tratar de organizar el árbol izquierdo.
La pila quedara así:

1 MCLDFKJH G
LDCFMKHJ

Vamos a considerar la G del recuadro como un apuntador que esta en la pila que
nos indica la dirección del nodo padre de este sub.-árbol derecho. Ahora debemos
seguir trabajando con el sub.-árbol izquierdo.
EAIB

IABE

De la misma forma, el nodo raíz de este nuevo árbol es E. este nodo debe
conectarse al nodo G así

E
Q
El apuntador que siempre debe estar dirigido al nodo al cual se conectara el
nuevo nodo posteriormente. Siempre el nuevo nodo será indicado por el
apuntador p. con lo anterior el árbol estará organizado así:

E MCLDFKJH
LDCFMKHJ

AIB
IAB
Obsérvese con cuidado porque el nodo E no tiene sub-árbol derecho. Siguiendo
el mismo orden, debemos crear un nodo A, el cual conectara por la izquierda con
E y este nodo si tendrá sub- árbol por la derecha, así:

E MCLDFKJH
LDCFMKHJ

I B
I B

Como siempre que aparezca un sub-árbol derecho debemos actualizar la pila , su


nueva información será:

1 MCLDFKJH G B A
LDCFMKHJ B

Siguiendo por la izquierda, ahora podemos conectar el nodo I, quedando el árbol


así:
G

E MCLDFKJH
LDCFMKHJ

I B
B
En este lugar debemos efectuar un retiro de la pila y conectar el nuevo nodo por
la dercha del nodo indicado por el apuntador que estaba almacenando en el
primer elemento de la pila.
Con esto, el arbol queda así:
G

E MCLDFKJH
LDCFMKHJ

I B

Y la pila contendrá solamente un elemento. Como ya se distribuyo la información


el árbol izquierdo, debemos retirar de la pila el elemento y conectar por la derecha
un nuevo nodo M, quedando el árbol así:
G

E M

A CLDF KJH
LDCF KHJ

I B

La nueva información de la pila será.

1 KJH M
KHJ

Y continuamos trabajando con el árbol izquierdo. Siguiendo hacia la solución,


debemos crear un nodo C y guardar en la pila el sub-árbol derecho que se
conectara al nodo C posteriormente.

LD F KJH
I A B ELD C F M KHJ
La pila hasta el momento tendrá estos datos:

1 KJH M F C
KHJ F

Acercándonos un poco mas hacia la solución, el árbol se puede ver así:

E M

A KJH
C KHJ

L F
I B F

D
D

Y la pila almacenara la siguiente información:

1 KJH M F C D L
KHJ F D
Obsérvese que siempre que se identifique un sub-árbol derecho, la pila debe ser

actualizada. Como ya se acabo la información a distribuir por la izquierda,

debemos efectuar un retiro de la pila, con el propósito de seguir el proceso.

Efectuando este retiro y sabiendo el nodo al cual debemos conectar el nuevo

nodo por la derecha, podemos hacer adecuadamente la inserción del nuevo nodo.

El primer elemento de la pila es:

D L
D

Esto quiere decir que el nodo D se debe conectar a la derecha del nodo L, así:

E M

A KJH
C KHJ

L F
I B F

De la misma manera, el nodo F debe conectarse a la derecha del nodo C.

Después de conectar el nodo F, debemos retirar de la pila el último elemento y

comenzar a distribuir por la izquierda la nueva informaron. Veamos el arbol hasta

este momento:
G

E M

JH
I A B L DC F K HJ
Y la pila contendrá la siguiente información

1 JH L
HJ

Ahora al haber distribuido la rama izquierda (no existe rama izquierda e K ),


podemos retirar de la pila su único elemento y crear un nodo J e insertar en la pila
su rama derecha, ( no existe rama derecha), así:

E M

A
C K

L F J
I B

D queda vacía H
Al observar el proceso, vemos que la pila y falta adicionar al árbol el
nodo H. con esto podemos afirmar que el proceso se debe efectuar mientras la
pila no este vacía o exista información para distribuir por la rama izquierda. Por lo
tanto el árbol final será:
G

E M

I A B L DC F HK J
Existe un buen número de formas para construir una función que efectué el
proceso anterior. A continuación presentamos una de estas versiones codificada
en lenguaje C.

NOTACIONES INFIJO, POSFIJO Y PREFIJO


Cuando se nos pregunta, por ejemplo, cuanto es el resultado de 5 multiplicado por
8 más 3, la respuesta automática que se da es 43. No se da el caso de que la
respuesta dad sea 55. Ahora si pregunta es: cual es la respuesta de 3 mas 5
multiplicado por 8, también volveremos a dar la misma respuesta: 43. No se nos
ocurre sumas 3 y 5 luego multiplicar la respuesta por 8 para que nos de 64. Se
nos pregunta cual es la respuesta de 5 por 2 mas 8 por 3, la respuesta dada es
34. Nos hemos acostumbrado a través del tiempo a que el operador * tiene mas
prioridad que el operador + y así lo trabaja cerebro. La notación con la cual
trabajamos los humanos este tipo de expresiones se denomina infijo, donde la
presencia de los operadores es:

* /
- +
=
Los humanos trabajamos con notación infijo. De la misma manera los
computadores están diseñados para que reconozcan la misma prioridad que
reconocemos los humanos. La instrucción:
Resol = 5 * 2 + 8 * 3;
Deja almacenada, por ello, la cifra 34, ya que la asociación automática es:
(result: (5 * 2)+(8 * 3));
Si deseamos que un computador, o un ser humano, calcule:
Resul= 5 * 2 + 8 * 3;
Pero sumando 2 y 8 primero, debemos diseñar la instrucción así:
Result= 5 * (2 + 8) * 3:
Se utilizan los paréntesis para modificar la prioridad de los operadores.
Un programador al indicarle esta instrucción a un computador:
Resul= 5 * 2 + 8 * 3;
Espera la respuesta 34 pero no le interesa como lo hizo la maquina.
Internamente, esta operación la ejecuta utilizando una pila. La operación la
ejecuta reconociendo objeto a objeto. Vamos a ilustrar la transformación que debe
hacer la maquina con el propósito de efectuar la operación anterior. De lo único
que esta enterada tanto la maquina como el programador, es que el operador *
tiene mas prioridad que el operador +. La transformación que se realiza es
convertir la expresión de notación infijo a notación posfijo lo cual se estudiará en
el siguiente numeral. A continuación estudiaremos que es la notación posfijo.
La notación posfijo, es otra manera de escribir una expresión aritmética. La
notación posfijo, se caracteriza por la ausencia de paréntesis. Esta notación,
aunque nunca utiliza paréntesis, es presentada sin ningún tipo de ambigüedad.
Veamos su naturaleza. Si tenemos una expresión en notación infijo. Por ejemplo:
a +b
Para escribir esa misma expresión en posfijo. Se debe ejecutar los siguientes
pasos:
1. agrupar utilizando paréntesis, de acuerdo a la prioridad de los operadores,
así:
(a+b)
2. escribir en posfijo la expresión, así:
ab+
Obsérvese que en la notación posfijo, el operador se escribe después de los
operadores . Veamos otro ejemplo:
a+b*c
Agrupando tenemos:
a+(b*c)
Convirtiendo a posfijo la expresión entre paréntesis resulta:
a+(bc*)
Ahora tratando la expresión entre paréntesis como un operador tenemos
a ( b c * )+
y destruyendo los paréntesis, nos queda la expresión escrita en posfijo:
abc*+
Veamos este ejemplo;
(x*y)+(v*w)
Primero debemos convertir las expresiones encerradas entre paréntesis a
notación posfijo, así:
(xy*)+(vw*)
Y luego toda la expresión a notación posfijo, así
xy*vw*+

Veamos estos ejemplos:


1. (a+b)*( c+d) (ab+)*(cd+) ab+cd+*
2. a+b-c (ab+)-c ab+c-
3. (a+b)*(c-d)*e*f ((( a b + ) * ( c d - )) * e ) * f
(( a b + c d - * ) * e ) * f
(ab+cd-*e*)*f
ab+cd-*e*f*
4. (a+b)*(c/(d-e)+f)-g
(ab+)*(c/(de-)+f)-g
( a b + ) * ( ( cd e - / )+ f ) – g
(ab+)*(cde-/f+)-g
ab+cde-/f*g–
5. vamos a suponer que la operación exponenciación esta definida y la
representamos así: además, tiene la mayor prioridad de todos los
operadores. Veamos estos ejemplos, usando este nuevo operador:
(a b c) (a b) c ab c
6. a b * c – d + e / f/ (g+h) ((a b) * c – d ) + ( e / f ) / ( g+ h )
(ab c * d - ) + ( ef / gh + / )
ab c * d – ef / gh + / +
7. a + ((( b – c ) * ( d – e ) + f ) / g ) (h – j )
a + ((( bc - de - * f + ) / g ) (hj - )
a + (( bc – de - * f + a / hj- )
abc – de - * f + g / hj- +
Existe otro tipo de notación para escribir las expresiones aritméticas. Esta nueva
notación recibe el nombre de prefijo y recaracteriza porque los operadores se
escriben primero que los operadores. Por ejemplo la expresión:
a+b
Escrita en notación prefijo, sería:
-ab
En general todas las reglas para convertir infijo a posfijo, se aplican para efectuar
las conversiones infijo a prefijo, tendiendo en cuenta que los operadores se
escriben antes que los operadores. Veamos estos ejemplos:

1. a+b+c (a-b)+ (+ab)+c


++abc
2. a+b-c (a-b)-c (+ab)-c
-+abc
3. (a+b)*(c-d) (+ab)*(-cd)
*+ab-cd
4. a+b/c-d a+(b/c)-d
(a+(/bc))-d
(+a/bc)-d
- + a / bcd
5. a b*c-d+e/f/(g+h)
(((a b) * c ) – d ) + ( e/f ) / (g+h)
( - * abcd) + ( / ef ) / ( + gh)
- * abcd + (//ef + gh)
+ - * abad //ef+gh
Podemos también plantear algunos ejemplos para convertir de posfijo a prefijo o
infijo. Veamos primero algunos ejemplos para convertir de posfijo a infijo:
1. ab+
El operador se debe aplicar a los últimos dos operandos, quedando así:
a+b
2. ab+c-
El análisis se comienza por la izquierda de la expresión. Se debe recorrer
la expresión hasta que encontremos un operador, así:
ab+c-
Una vez hayamos encontrado el primer operador, debemos aplicar ese
operador a los dos últimos operandos que lo precedan, así
(a+b)c-
Y luego debemos seguir analizando la expresión hasta encontrar el
próximo operador:
(a+b)c-
Una vez hayamos encontrando el próximo operador debemos aplicar ese
operador a los últimos dos operandos. Obsérvese que la expresión
encerrada entre paréntesis, se debe trabajar como un solo operando.
(a+b)-c
3. ab+cd-*
Siguiendo el proceso anterior, tenemos:
(a+b)cd-*
(a+b)(c-d)
(a+b)*(c-d)
4. ab+cd-*e*f* (a+b)cd - * e * f *
(a+b)(c-d)e * f *
((a+b)*(c-d)*e) f *
((a+b)*(c-d)*e) * f
(a+b)*(c-d) * e * f
5. ab c (a b)c
(a b)c a b c
6. ab c*d-ef / gh+/+
(a b*c)d-ef / gh + / +
(a b*c-d)ef / gh + / +
(a b* c-d)(e/f) gh + / +
(a b*c-d)(e/f)(g+h) / +
(a b*c-d)((e/f)/(g+h)) +
(a b*c-d)+(e/f)/(g+h)
A b*c-d+e / f / (g+h)
De la misma manera, podemos pasar de la notación prefijo a la notación infijo;
veamos un ejemplo
+ab
En este caso debemos analizar la expresión de derecha a izquierda hasta que
encontremos el primer operador. Una vez lo hayamos encontramos, aplicamos
este operador a los dos operandos que le siguen, así:
a+b
Veamos algunos ejemplos:
1. -+abc -(a+b)c
(a+b)-c a+b-c
2. *+ab - cd * + ab(c-d)
* (a+b) (c-d)
(a+b) * (c-d)

3. -*+abc - de -fg -*+abc – de (f-g)


-*+abc (d-e) (f-g)
-*(a+b)c(d-e)(f-g
-((a+b)*c)(d-e)(f-g)
(((a+b)*c)-(d-e))(f-g)
((a+b)*c-(d-e)) (f-g)
EJERCICIOS
1. cada una de las siguientes expresiones escritas en fijo convertirlas a posfijo
a) (x+y)*(z (s+t)+u)-v
b) a+((x+y)*(w+v)) (i+j)
2. Convertir las expresiones del ejercicio anterior a prefijo
3. Convertir las siguientes expresiones de prefijo a infijo:
a) + - xyz*i**klm
b) ++1-* mno/+pq*rst
4. Convertir las siguientes expresiones en posfijo a infijo
a) pqrst-+ *uv*-
b) lm-n+opq-+

REPRESENTACION DE EXPRESIONES ARITMETICAS EN ÁRBOLES


BINARIOS
Una expresión aritmética puede expresarse utilizando un árbol binario. Por
ejemplo la expresión:
a+b
Expresada en un árbol binario es:

a b
El operador +aplica a los operandos de la rama izquierda y la rama derecha. La
expresión:
a+b*c
Quedara expresada así:
+

A *

B C

El árbol queda organizado así ya que la expresión implícitamente esta asociada


así:
a+(b*c)
Porque por definición el operador * es de mayor jerarquía que el operador +
Vamos a construir un árbol par ala expresión:
a/b* c+ d e*f
para defecto esta expresión escrita en infijo, asocia sus operandos así:
(( a / b ) * c ) + (( d e ) * f )
Esto indica que la raíz del árbol contiene el operador+. La rama izquierda contiene
la expresión (a / b ) * c y la rama derecha la expresión (d e )*f. siguiendo este
orden de ideas el árbol queda construido así:

* *

/ C F

A B D E
Existe un método sencillo para construir una árbol que representa un a expresión.
El primer paso consiste en transformar la expresión de infijo a prefijo y partiendo
de la expresión escrita en prefijo construir el árbol. Veamos algunos ejemplos:
Infijo a+b
Prefijo +ab
Al tener la expresión en prefijo, fácilmente se puede construir el árbol siguiendo
este método:
Se insertan nuevos nodos por la izquierda del árbol que hayamos insertado un
operando

A
+a

Luego volvemos hacia atrás en el árbol e insertamos el siguiente elemento a su


derecha.

A B +ab

Si el nodo insertado fue un operador, insertamos el siguiendo a su izquierda. Si el


nodo insertado fue un operando, volvemos hacia atrás e insertamos el siguiente
nodo a la derecha. Este proceso se continúa hasta que se agote la expresión
escrita en prefijo. Veamos otro ejemplo:

Infijo a+(a*c d)
Primero debemos convertir la expresión a prefijo:
+a*b cd
Luego debemos insertar nuevos nodos hasta encontrar un operando:

A
+a

Luego volvemos hacia atrás e insertamos el siguiente elemento a la derecha:

A *
+a*

Como el último nodo insertado fue un operador, debemos insertar el siguiente a la


izquierda:

A *

B
+a*b
Como el nodo mas reciente insertado fue un operando, volvemos hacia atrás e
insertamos el siguiente a la derecha.

A * +a*b

Como el último nodo insertado fue un operador, debemos insertar el siguiente a la


izquierda:

A *

B C
+a*b c

Como el nodo más reciente insertado fue un operando, volvemos hacia atrás e
insertamos el siguiente a la derecha:

A *

B
+a*b cd

Siguiendo este método, y antes de seguir adelante, se recomienda al lector


C
revisar los árboles para las siguientes expresiones D
en prefijo:

+ D

A *

B C

A B+ * CD E / F
CONVERSION DE UNA EXPRESION EN UN ARBOL BINARIO A SU
REPRESENTACION INFIJO
En este numeral se desarrollara una función que a partir de un árbol binario,
genere un arreglo que almacene la expresión en infijo. Antes de entrar
propiamente en el desarrollo del problema, estudiaremos algunas propiedades de
estos árboles. Supongamos que tenemos en la memoria del computador un árbol
así:

A *

B C
Este árbol representa la siguiente expresión
a+b*c
La expresión anterior escrita en prefijo será:
+ a * bc
Si recorremos el árbol en preorden los datos generados serán:
+a*bc
Lo anterior nos permite plantear la primera propiedad:
Si se recorre un árbol en preorden, los datos generados representan la expresión
escrita en prefijo.
Si el árbol anterior recorremos en posorden, los datos generados serán:
abc*+
Estos datos representan la expresión
a+b*c
Escrita en posfijo, lo cual nos permite plantear la segunda propiedad:
Si se recorre un árbol en posorden, los datos generados representan la expresión
escrita en posfijo.
Es de esperarse que si recorremos el árbol en inorden, la expresión generada
estará escrita automáticamente en infijo. Veamos:
a+b*c
Para el caso que nos ocupa se cumplió la norma. Veamos otro ejemplo:
(a+b) c/d+e
Esta expresión escrita en prefijo será:
+/ +abcde
Y en posfijo será:
ab+c d/e+
y el árbol generado será:

/ E

+ C
A B
Al recorrerlo en preorden, los datos generados serán:
+/ +abcde
Al recorrerlo en posorden, los datos generados serán:
ab+c d/e+
Las dos propiedades anteriores se cumplen. Se recorremos el árbol en inorden
los datos generados serán:
a+b c/d+ e
Pero esta expresión, para su evaluación, se asocia así:
a+((b c)/ d)+e
Y es bien diferente da la inicial, la cual era:
(a+b) c/d+e
Lo cual nos permite plantear la siguiente propiedad:
Si se recorre un árbol en inorden, los datos generados no representan la
expresión escrita en infijo.
Si queremos que de un árbol se genere la correspondiente expresión en infijo no
basta con recorrerlo en inorden, además debemos efectuar un proceso que
parentice la expresión. Para el ejemplo, el recorrido inorden del árbol es:
a+b c/d+e
Como el operador tiene más prioridad que los demás, y el operador / tiene más
prioridad que el +, al tratar de evaluar la expresión esta se asocia así:
a+((b c)/d)+e
Debemos diseñar un proceso que genere un arreglo infijo con los siguientes
datos:

( A + B ) C / D + E

Lo cual implica que en la medida en que generamos este arreglo debemos ir


incluyendo paréntesis donde sea necesario. Veamos la naturaleza del problema:

A + B C/ D E
Como el operador de la raíz aplica a los dos subárboles, gráficamente el árbol
anterior lo podemos representar así: +

/ E

2
D

3 + C

4
A B
B

Si cada cuadro representa un par de paréntesis, este árbol lo podríamos escribir


así:
(rama izquierda )+e
((rama izquierda )/)d)+e
(((rama izquierda ) c ) /d)+e
((((rama izquierda) + b) c ) / d ) +e
((( a ) + b) c ) / d + e
Ahora retiramos los paréntesis innecesarios, debidos a la jerarquía de los
operadores, tendremos la expresión:
((( a +b) c ) / d ) + e
No podemos retirar los paréntesis que encierran la expresión (a+b), debido a que
se cambia la expresión ya que el operador es de mayor prioridad que el
operador +. Los paréntesis ya encierran la expresión (a+b) c si se puede retirar,
debido a que el operador es de mayor jerarquía que el operador /
((a+b) c/d)+e
Los paréntesis que encierran la expresión (a+b) c / d pueden ser retirados ya
que el operador + es el de al mínima jerarquía. Con la cual la expresión
debidamente patentizada es:
Veamos otro ejemplo:

+ C

A B
B
Si recorremos el árbol en inorden, los resultados serán:
a+b c
Lo cual es diferente a la expresión que esta representada en el árbol.
(a+ b ) c
Si el árbol es:

A B
B
Al recorrerlo en inorden los resultados son:
a b+c
y no existe la necesidad de insertar paréntesis en la expresión. La diferencia, en
este caso particular, radica en que si el operador padre tiene más jerarquía que el
operador hijo, debemos patentizar la rama izquierda o derecha del árbol.
Observemos los siguientes árboles:
+

+ C C

A B A B
B - B

- C

A B
B

Para el árbol A la expresión será:


(a+b) c B

Debe patentizarse. El operador tiene mas jerarquía que el operador +

B
Para el árbol la expresión será:
a b+c
no se necesitan paréntesis. El operador + tiene menos jerarquía que el operador

Para el árbol C la expresión será:


(a-b)-c
Para esta expresión., no son necesarios los paréntesis ya que sin ellos la
asociación se haría de la misma manera. Veamos este caso.

-
C

A B
Para este caso al recorrer el árbol en inorden, se genera la siguiente expresión:
c–a–b
Se deben insertar paréntesis ya que es muy diferente la expresión que está
representada en el árbol:
c – (a - b )
Ahora debemos puntualizar en que momento se necesitan insertar paréntesis.
La respuesta es muy sencilla. Veamos este ejemplo

*
+ /

+ C
A -

B C B C

Al recorrer el árbol en inorden, el resultado será:


a+b-c d+e*f
Debemos insertar paréntesis a la expresión a+b-c y también a la expresión d+e*f.
al final arreglo infijo quedara así:
(a+b–c) ((d + e ) * f )
Como puede identificarse esta situación. Obsérvese que si existen dos nodos
cuya relación es padre-hijo y los dos contienen operadores, debemos abrir un
paréntesis si el operador hijo tiene menos prioridad que el operador padre. Este
paréntesis que se abre debe existir siempre y cuando el padre tenga más
jerarquía que el hijo y asea izquierdo o derecho. Para insertar un paréntesis son
necesarias tres condiciones:
1. que el nodo contenga un operador.
2. que su hijo (izquierdo o derecho) contenga también un operador.
3. que el nodo padre sea un operador de mayor jerarquía que el nodo hijo.
Si estas tres condiciones se cumplen debemos abrir un paréntesis. Este
paréntesis, guardaremos en algún lugar el paréntesis que cierra para que en su
momento, se incorpore al arreglo infijo. Para la solución a este problema debe
servirnos una pila ya que el proceso se asimila a escribir un árbol en inorden, con
la salvedad de que bajo las tres condiciones expuestas anteriormente, debemos
insertar un paréntesis a la pila.

CAPITULO IV.
APLICACIONES DE LOS GRAFOS
En este capítulo, vamos a estudiar algunos problemas que se resuelven usando
los grafos. El objetivo de este estudio es mostrar al lector diferentes técnicas para
resolver problemas prácticos usando esta estructura. El lector con base en estos
conocimientos estará en capacidad de imaginarse otras aplicaciones prácticas de
los grafos y los dígrafos. Hemos tratado de presentar las aplicaciones más
clásicas como son: Algoritmo de Prim. Algoritmo de Kruskal. Algoritmo de Dijkstra,
el problema de las parejas, la clasificación topológica, la ruta crítica, etc.
ALGORITMO DE PRIM
Este algoritmo resuelve el problema de escoger la mejor alternativa entre las
muchas que se pueden presentar. Veamos el siguiente grafo.
Este grafo esta compuesto por 13 vértices y puede representar una red de

1 7
4 5
3 2 5
8
7 5
7 1 4
6
4 6
9 10
7 4

computadores, un circuito, un sistema de carreteras, etc. Cada arco tiene un valor.


Este valor puede interpretarse como el costo para llegar de un vértice a otro, por
ejemplo el costo para llegar del vértice 4 al vértice 7 es 8 que es el mismo costo
para llegar del vértice 7 al vértice 4.
El problema que se resuelve a través del algoritmo de PRIM es escoger el
conjunto de arcos de maneta que conecten todos los vértices y además que la
suma de costos sea mínima.
Para el grafo anterior, los arcos que cumplen con estas dos propiedades se
pueden escoger de acuerdo al siguiente procedimiento:

1 2 3

4 5

6 7 8

9 10

11 12 13

El método es el siguiente: debemos determinar en que vértice empezamos el


proceso. Para el efecto comencemos en el vértice 2. Desde 2 extendemos todos
los arcos así:
1 8 2 6 3
1 7
4 5
6 7 8

9 10

11 12 13

Y marcamos el vértice 2. Luego escogemos el arco cuyo costo sea menor. Si


existen dos arcos con el mismo costo, podemos escoger cualquiera y el efecto
final es el mismo. Para este caso debemos escoge el arco que llega al vértice 4.
Marcamos el vértice 4 y extendemos los arcos desde el vértice 4, tendiendo
presente que hacia los vértices ya marcados no pueden extenderse nuevos arcos.
1 8 2 6 3
1
4 2 5
3 8
6 7 7 8
9 10
11 12 13

En el paso anterior se observa que si se extienden los arcos desde el vértice 4

quedarían 2 arcos incidentes en el vértice 5. El procedimiento considera esta

situación. Cuando dos arcos inciden en un mismo vértice no marcado, se deja el

arco de menor peso. Por esta razón el arco 4:5 de peso 2 prevalece sobre el arco

2:5 de peso 7. Ahora debemos escoger, de los no marcados, el vértice en el cual

incide el arco de menor peso, escogemos el vértice 5, lo marcamos y

extendemos desde 5 los arcos hacia los demás vértices así:

1 8 2 6 3

4 2 5

3 5 5

6 7 7 4 8

9 10

11 12 13

Ahora escogemos el vértice 6 y seguimos el procedimiento

1 2 6 3

2 4 2 5

3 5 5

6 7 4 8

1 9 10

11 12 13
Ahora podemos escoge el vértice 11 y seguir el procedimiento descrito. Al final del

proceso, es decir cuando hayamos repetido el procedimiento anterior N-1 veces,

siendo N el número de vértices, tenemos resuelto el problema Veamos:

1 2 3

2 4 2 5 5

3 7

6 1 8

1 9 3 10 1

11 2 12 3 13

El orden en el cual se escogieron los vértices para llegar a este resultado es:

2,4,5,6,11,1,12,13,8,9,7,10,3

La suma es 28 y esta cifra es la mínima que se puede conseguir. Si el sistema

inicial es un grafo que representa un sistema vial, podemos decir que 28 es el

mínimo kilometraje que se puede obtener para unir todas las ciudades. Se invita

al lector a desarrollar el mismo ejercicio comenzando desde el vértice 12. Veamos

el resultado final:

1 2 3

2 4 2 5 5

6 7 8

4 1
1 3 1

9 10

11 2 12 2 13

El orden de recorrido para llegar a este resultado fue el siguiente:

12,11,6,1,4,2,5,13,8,9,7,10,3

Obsérvese que la suma28 se mantiene y la estructura del árbol expandido resulto

igual, aunque hubiera podido resultar diferente.

Para el desarrollo del algoritmo se utilizan las siguientes variables:

1. una matriz de adyacencia

2. un arreglo donde se almacenan los costos mínimos

3. un arreglo de padres.

4. un arreglo de vértices marcados.

5. la variable suma.

La matriz de adyacencia, almacena en cada entrada M(i)(j), en costo para llegar

del vértice i al vértice j. El arreglo mínimo ( ), almacena el costo mínimo de todos

los arcos que van quedando a través del proceso.

El arreglo padre ( ), almacena los padres de los vértices que se van escogiendo en la

medida ñeque avanza el proceso. El arreglo marcas ( ) mantiene el estado de marcado (1) o

no marcado (0) para cada vértice. La variable suma, almacena la suma de los arcos que

finalmente fueron para cumplir el objetivo del trabajo. Veamos la matriz de adyacencia

para el grafo anterior.

1 2 3 4 5 6 7 8 9 10 11 12 13
1 * 8 * * * 2 * * * * * * *
2 8 * 6 1 7 * * * * * * * *
3 * 6 * * * * * 5 * * * * *
4 * 1 * * 2 3 8 * 7 * * * *
5 * 7 * 2 * * 5 5 * 4 * * *
6 2 * * 3 * * * * 4 * 1 * *
7 * * * 8 5 * * * 1 6 * * *
8 * * 5 * 5 * * * * 6 * * 1
9 * * * 7 * 4 1 * * 3 * 7 *
10 * * * * 4 * 6 6 3 * * 4 *
11 * * * * * 1 * * * * * 2 *
12 * * * * * * * * 7 4 2 * 3
13 * * * * * * * 1 * * * 3 *
Donde exista un carácter *, significa que entre estos dos vértices no existe arco y

estará almacenado el numero 32767, es decir el mayor valor entero. Para cumplir

el trabajo, el algoritmo debe estructurarse como un ciclo desde 2 hasta N, donde

es el número de vértices.

1. Barranquilla

2. Medellín

3. Cúcuta

4. Bucaramanga

5. Tunja

6. bogota

7. Cali

8. Popayán

9. pasto

10. Neiva

11. Leticia

1 2 3 4 5 6 7 8 9 10 11
1 84 85 141 175
2 84 32 25 35
3 85
4 32
5 12 36 122
6 141 25 12 47 110
7 35
8 47 28
9 175 28
10 36
11 122 110
1. Siguiendo el método descrito, calcule el mínimo número de kilómetros de

carretera que se debe construir para unir todas las ciudades de Colombia

incluidas en este sistema vial. (Cada cifra multiplicada por 10 da el numero

de kilómetros real entre ciudad)

2. elabore el trabajo del ejercicio 1 utilizando el algoritmo PRIM ( ).

3. la función PRIM ( ). Calcula la suma mínima del conjunto de los arcos que

se deben incluir para cubrir todos los vértices del grafo, de manera que el

nuevo grafo sea fuertemente conectado. El objetivo de este ejercicio

consiste en elaborar un nuevo algoritmo PRIM1( ) que calcule la suma

máxima del conjunto de arcos que se deben incluir para cubrir todos los

vértices del grafo de manera que l grafo resultante sea fuertemente

conectado

4. para el siguiente grafo, calcule los valores finales de los arreglos:

Mínimo ( )

Padres ( )

Marcas ( )

Determine el valor suma y dibuje el árbol expandido resultante.

Lleve a cabo el proceso, primero manualmente y luego utilizando el algoritmo


PRIM ( )
5. modifique el algoritmo PRIM ( ) de manera que reciba por valor el vértice
desde el cual se desea empezar el proceso y que realice su tarea desde el
vértice deseado.
6. dibuje el árbol expandido que resulta al procesar el grafo del ejemplo
desarrollado en el numeral 11.1 desde el vértice 7 determine el contenido
final de los arreglo:
Mínimo ( )
Padres ( )
Marcas ( )
ALGORITMO DIJKSTRA
El objetivo de este algoritmo, consiste en calcular la distancia mínima entre un
vértice y todos los demás. Por ejemplo, podemos utilizar un algoritmo para
determinar que la mínima distancia de la ciudad de Bogota a las demás
ciudades colombianas, están dadas por el siguiente árbol expandido (ver
ejercicio 1, numeral 11.2)

Para efecto de ilustrar el procedimiento, tomaremos el siguiente grafo:


Donde la matriz de adyacencia almacena la siguiente información:
1 2 3 4 5 6 7 8 9 10 11
1 * * * * * * * * * * *
2 2 * 4 3 5 6 * * * * *
3 4 4 * * * 5 4 1 * * *
4 * 3 * * 3 * * * 2 * *
5 * 5 * 3 * 1 * * 6 * *
6 * 6 5 * 1 * 4 * 2 3 *
7 * * 4 * * 4 * 4 * 1 *
8 * * 1 * 1 * 4 * * 5 *
9 * * * 2 6 2 * * * 2 1
10 * * * * * 3 1 5 2 * 6
11 * * * * * * * * 1 6 *
Obsérvese que también para este procedimiento, los vértices que no están unidos
por el mismo arco, almacén un mayor valor en la entrada correspondiente en la
matriz. Por ejemplo del vértice 11 al vértice 8. Al no existir arco entre estos dos
vértices, se almacena en la entrada M(11)(8) un mayor valor. Para el desarrollo de
este algoritmo, debemos observar que el mayor no puede ser 32767, si estamos
trabajando en maquinas donde cada entero tiene 16 bits. El mayor valor debe ser
una cifra tal que la suma de la cifra escogida mas el costo de un arco no exceda
el dato 32767. Si no se tiene en cuenta esta restricción, los datos serán
incorrectos. Para la prueba a la rutina utilizando el grafo anterior, se trabajo como
mayor valor el dato 32000.
El procedimiento es parecido al algoritmo PRIM ( ) la diferencia consiste en que
se escoge el vértice donde la suma de todos los arcos para llegar del vértice
origen hasta dicho vértice sea mínima. Veamos.
1
2 3
4 5 6 7 8
9 10
11
Si comenzamos por el vértice 1, debemos primero extender los arcos desde el
vértice 1 y marcar el vertice1, así:
Aquí se escoge el vértice donde el número entre paréntesis sea menor. Este
número es la suma desde el vértice origen hasta dicho vértice. Para el caso el
vértice escogido es el 2. Luego debemos extender los arcos desde el vértice 2 de
la siguiente manera:
1(0)
2 4
2(2) 3(4)
3 5 6
4(5) 5(7) 6(8) 7 8
9 10
11
Obsérvese que el arco 2:3 no se extendió ya que la suma 3(4) es menor o igual
que la suma 2(6);4<=6. Únicamente se extiende el arco si esta relación es mayor.
Ahora escogemos el vértice 3 y extendemos los arcos desde dicho vértice,
quedando el árbol expandido así:
1(0)
2 4
2(2) 3(4)
3 5 6 4 1
4(5) 5(7) 6(8) 7(8) 8(5)

No se debe olvidar que hacia los vértices que ya están marcados no se pueden
extender arcos. Siguiendo el procedimiento descrito y escogiendo los vértices en
el siguiente orden:
4,8,5,9,6,7,11,10
El árbol expandido final es:
1(0)
2 4
2(2) 3(4)
3 5 6 4 1
4(5)
5(7) 6(8) 7(8) 8(5)
2
9(7) 2 10(9)
1
11(8)
Se puede asegurar que la distancia mínima entre el vértice 1 y todos los demás
es la indicada en la cifra entre paréntesis. Se recomienda al lector, utilizar este
procedimiento para averiguar la distancia mínima entre Bogota y las ciudades de
Colombia. El algoritmo DIJKSTRA ( ), fundamentalmente es el mismo que el
algoritmo PRIM ( ), con una única diferencia. El vértice escogido, es el que tenga
la mínima distancia acumulada desde el origen hasta dicho vértice. Para el
desarrollo del algoritmo, utilizaremos las siguientes variables:
1. la matriz de adyacencia
2. un arreglo de distancia mínimas
3. un arreglo de padres
4. un arreglo de vértices marcados
El arreglo mínimo ( ), se inicializa con la fila 1 de la matriz de adyacencia.
ORDEN TOPOLÓGICO EN UN DÍGRAFO
El orden topológico en un dígrafo, lo podemos ilustrar a través de un ejemplo.
Supongamos que el decano de la carrera de la ingeniería de sistemas solicita un
orden específico para que un estudiante pueda desarrollar su carrera. La única
información que tenemos para resolver el problema es el siguiente programa de
estudios
CODIGO NOMBRE PRE REQUISITO
1. Matemáticas I
2. Ingles I
3. El robot de Karen
4. Computadores
5. Matemáticas II 1
6. Ingles II 2
7. Turbo Pascal 3,4
8. Matemáticas III 5
9. Ingles III 6
10. Estructuras de datos I 1 ,7
11. Lenguaje C 9, 10
12. Assembler 9
13. Estructura de Datos II 8,10
Para efectos prácticos, solamente dejamos el programa de estudios hasta este
nivel. El problema lo podemos resolver fácilmente utilizando un dígrafo. El
programa anterior, lo podemos resolver fácilmente en un dígrafo, utilizando
solamente los códigos de las materias así
2 9

6 1
2
1
3 0

7 1
1

1
5 3

1 8

El dígrafo anterior representa el programa académico. Por ejemplo la materia


Estructura de Datos II, no puede verse sin haber aprobado las materias Estructura
de Datos I y Matemáticas III. Existe un método denominado orden topológico, el
cual nos da el orden en el cual se debe desarrollar este programa académico para
ver las materias cumpliendo con los pre requisitos exigidos para cada asignatura.
Tomemos el dígrafo anterior y almacenémoslo en dos listas de adyacencia.

1 5, 10 1
2 6 2
3 7 3
4 7 4
5 8 5
6 9 6
7 10 7
8 13 8
9 11, 12 9
10 11, 13 10
11 11
LEY DE 12 ADYACENCIA LISTA
12
DE ADYACENCIA 13 INVERTIDA
13

El método consiste en contar los grafos de entrada para cada vértice y


almacenarlos en un arreglo. Para contar cuantos grafos de entrada tiene cada
vértice, debemos utilizar la lista

GRAFOS
Los grafos son estructuras de daros, utilizados comúnmente en el manejo de
redes, en la construcción de circuitos electrónicos, en la estrategia de ventas, en
el área de economía, cartografía y otras muchas áreas del conocimiento. En este
capitulo, nos proponemos estudiar la teoría relacionada con los grafos y en el.
Capitulo 11 mostraremos a través de varios ejemplos su aplicación practica.
GRAFO
Un grafo es una estructura de datos compuesta por vértices y arcos.
Gráficamente un grafo se puede ver así:

El conjunto de los veraces es:


V= (A,B,C,D,E,F,G,H,I,J,K,L)
Un arco une dos vértices adyacentes. Por ejemplo el arco JK o el arco EG o GE
no se puede hablar del arco AC. Se puede hablar del arco AB o BC.
GRAFO DIRIGIDO
Un grafo dirigido o dígrafo es aquel en el que sus arcos tienen una orientación.
Por ejemplo:

El arco BOGOTA – MEDELLIN, es completamente valido. En este dígrafo, no


existe el arco MEDELLIN –BOGOTA. El conjunto de vértices del dígrafo anterior
es
V= (BOGOTA, MEDELLIN, CALI, CUCUTA, BARRANQUILLA)
Veamos otro ejemplo
El conjunto de arcos es:
A= (BOGOTA-MEDELLIN, BOGOTA-BARRAMQUILLA, BARRANQUILLA-
CUCUTA, CALI-BARRANQUILLA, CALI-BOGOTA)
ADYACENCIA
Se dice que existe adyacencia entre dos vértices si están unidos por un arco.
Existen dos tipos de adyacencia:
 Adyacencia desde
 Adyacencia hacia
Por ejemplo para este grafo:

Los vértices A y B son adyacentes. A es adyacente a B y a su vez es adyacente a


A. en el caso de dígrafos la adyacencia se expresa desde o hacia. Veamos un
ejemplo:

Para este caso, se dice que A es adyacente hacia B. y D es adyacente hacia E. A

es adyacente desde C y a su vez D es adyacencia desde B

INCIDENCIA

Los arcos inciden en los vértices. Un arco es incidente en un vértice, si una de sus

puntos llega a ese vértice.

Por ejemplo:

A a B

El arco a, incide en A y B. el arco, es incidente en A y B.

Para el caso de los dígrafos la diferencia la podemos observar en el siguiente

ejemplo:
B a C

El arco a es incidente en C. Este arco no es incidente en B ya que ese arco sale

de B, nunca llega a B.

COMPONENTES CONECTADAS SEPARADAMENTE

Un grafo puede tener varios componentes. Por ejemplo el siguiente grafo.

A B
E

F G

C D H I

Un grafo puede tener varios componentes separados. Un grafo puede estar

formado por un número muy grande de componentes y este aspecto es necesario

tenerlo en cuenta cuando se están diseñando los algoritmos.

GRAFOS Y DIGRAFOS FUERTEMENTE CONECTADOS

Un grafo esta fuertemente conectado si desde cualquier vértice se puede llegar a

todos los demás. Por ejemplo

A B

C D
Desde cualquier vértice se puede llegar a todos los demás. De la misma manera.

Un dígrafo esta fuertemente conectado si desde cualquier vértice se pueden

visitar todos los demás.

Por ejemplo:
Desde los vértices A, C, D y E podemos llegar a todos los demás vértices. Desde
el vértice B no podemos lagar a ningún vértice. El dígrafo anterior no esta
fuertemente conectado.
GRAFOS Y DIGRAFOS DEBILMENTE CONECTADOS
Se dice que un grafo o un dígrafo es débilmente conectado, si por lo menos desde

un vértice no podemos llegar. El dígrafo inmediatamente anterior, cumple esta

propiedad.

CAMINO SIMPLE

Un grafo o dígrafo tiene un camino simple si partiendo de cualquier vértice

podemos recorrer la estructura sin repetir ningún vértice ni ningún arco. Por

ejemplo:

A B

C D E
Partiendo del vértice C, podemos recorrer todo el grafo sin repetir ni vértices, no

arcos

GRAFO EULERIANO

Un grafo es Euleriano si partiendo de cualquier vértice, podemos recorrer todos

los arcos llegando de nuevo al vértice origen. Par que el grafo sea Euleriano, se

pueden visitar los vértices cuantas veces sea necesario. Los arcos se pueden

recorrer solamente una vez.


Por ejemplo:

A B G

C D E F
El grafo es euleriano, ya que podemos recorrer todos los arcos sin repetir

ninguno. El orden del recorrido desde el vértice A puede ser:

ACDEFGBEHDAHBA

Obsérvese que no se repiten arcos aunque se visitan varios vértices mas de una

vez. Para que el grafo sea Euleriano, es necesario poder llegar al vértice origen

nuevamente.

GRAFO HAMILTONIANO

Un grafo es Hamiltonianosi partiendo de cualquier vértice, podemos recorrer todos

los vértices sin repetir ninguno, y finalmente podemos llegar al vértice origen.

Para este caso, los arcos se pueden recorrer una o más veces.

El grafo anterior es Hamiltoniano.

Los vértices se pueden recorrer así:

ACDEFGBHA

GRADO DE UN VERTCIE

El grado de un vértice es el número de arcos que inciden en ese vértice. Por

ejemplo:
El grado del vértice F es 4 y el grado del vértice C es 2. Veamos el siguiente

dígrafo

Para este caso, existen para cada vértice dos tipos de grado

Grado de entrada

Grado de salida

Los grados de entrada de un vértice en un dígrafo, se determinan por el número

de arcos que inciden en el vértice y los grafos de salida se determinan por el

número de arcos que parten del vértice.

Para el caso, los grados de entrada y salida para cada vértice son.

VERTICE GRADO –ENTRADA GRADO-SALIDA

A 2 0

B 2 0

C 1 3

D 0 3

E 2 1

GRAFOS REGULARES
Un grafo se dice que es regular, si todos los vértices tienen el mismo grado. Por

ejemplo: A B

C D

Todos los vértices tienen el mismo grado, por ello el grafo es regular.

ARCO CICLICO

Un arco es cíclico, si parte de un vértice y llega al mismo vértice. Por ejemplo:

A D

En el dígrafo anterior, tenemos dos arcos cíclicos.

El arco que parte de A y llega al mismo vértice y el arco que parte de B y llega a

B.

MULTIGRAFO

Un multigrado, es una estructura donde dos vértices están unidos por mas de un

arco ejemplo:
GRAFOS SIMPLES

Un grafo es simple si no tiene arcos cíclicos y existe un solo arco entre dos

vértices.

GRAFO COMPLETOS

Un grafo es completo si cada vértice tiene un grado igual a n-1 donde n es el

número de vértices que componen el grafo.

Por ejemplo el siguiente grafo es com

pleto:

Para este caso n = 6 y cada vértice tiene un grado igual a n-1=5

ALMACENAMIENTO DE UN GRADO EN LA MEMORIA D EUN

COMPUTADOR.

Existen dos formas de almacenar un grafo para su posterior procesamiento en un

computador.

En una lista de adyacencia o en una matriz de adyacencia.

Veamos este grafo:

Para almacenar este grafo en una lista de adyacencia, debemos trabajar con un

arreglo de listas. Cada una de estas listas almacena los adjuntos a un vértice

dado. Por ejemplo una lista tendrá almacenados todos los adjuntos al vértice E;
otra lista tendrá almacenados todos los adjuntos al vértice 1, etc. Veamos la lista

de adyacencia para el grafo anterior:

A B C

B A C D E G

C A B E F H

D B G

E
B C G H
F
C H
G B D E H I
H C E F G I
I G H

Existe otra forma de almacenar un grafo en la memoria de un computador.

En este último método se utiliza una matriz de adyacencia.

Cada elemento M (i)(j), contiene un numero 0 si el vértice i no es adjunto al

vértice j. por ejemplo para el grafo anterior, la matriz de adyacencia es:

A B C D E F G H I
A 0 1 1 0 0 0 0 0 0
B 1 0 1 1 1 0 1 0 0
C 1 1 0 0 1 1 0 1 0
D 0 1 0 0 0 0 1 0 0
E 0 1 1 0 0 0 1 1 0
F 0 0 1 0 0 0 0 1 0
G 0 1 0 1 1 0 0 1 1
H 0 0 1 0 1 1 1 0 1
i 0 0 0 0 0 0 1 1 0

Obsérvese queso doblamos la matriz por la diagonal todos los unos de la parte

superior se encuentran con los unos de la parte inferior y todos los ceros de la

parte superior se encuentran con los ceros de la parte inferior. Cuando un grafo
cumple esta propiedad se dice que es un GRAFO SIMETRICO. El programa para

almacenar un grafo en una matriz de adyacencia es muy parecido al programa

anterior. Su estructura es la misma. En este caso es un poco mas rápido ya que

no es necesario asignar memoria dinámica, solamente se asigna un1 o un cero a

la posición M (i)(j), dependiendo de si el vértice i es o no adjunto al vértice j.

UTILIZACION DE UNA LISTA O UNA MATRIZ DE ADYACENCIA

Para determinar cuando se debe usar una lista o una matriz de adyacencia, es

necesario observar si el grafo es disperso o no. Un grafo disperso es aquel que

tiene muchos vértices y pocos arcos. Cuando se esta trabajando con un grafo

disperso, es conveniente utilizar una lista de adyacencia. Cuando se esta

trabajando con un grafo con alto numero de arcos, se puede considerar la

posibilidad de trabajar con una matriz de adyacencia. En lo relativo a la eficiencia

de los algoritmos, también es conveniente hacer un análisis antes de escoger una

u otra estructura. A este respecto, podemos observar que la estructura enana lista

de adyacencia tiene V vértices y A arcos. Por esto para cubrir toda la estructura,

necesitamos revisar V+A variables. Por ejemplo

En este caso para cubrir toda la estructura, necesitamos revisar 11 variables. En

una matriz de adyacencia, donde se almacena un grafo de V vértices, para cubrir

la estructura, necesitamos revisar V2 variables.

Otro aspecto importante en esta escogencia, se refiere a la flexibilidad. Por

ejemplo para el siguiente dígrafo:

A B C
D E F
La lista de adyacencia y la matriz de adyacencia son:

A B C D E F
A B D
A 0 1 0 1 0 0
D C B 0 0 1 1 0 0
B
C 0 0 0 0 0 0
C D 0 0 0 0 1 0
E 1 1 0 0 0 0
D E F 0 0 1 0 0 0
MATRIZ DEADYACENCIA
E A B

F C

La conclusión es que si se necesita saber el grado de entrada de cada vértice lo


optimo seria utilizar una matriz de adyacencia. Debemos, por ultimo, pensar cual
estructura es más flexible para resolver un problema planteado.
LISTA DE ADYACENCIA INVERTIDA
La lista de adyacencia estudiada anteriormente, almacena encada lista el conjunto
de adjuntos hacia los vértices. La lista de adyacencia invertida almacena para
cada vértice la lista de adjuntos desde otros vértices. En razón a lo anterior la lista
de adyacencia invertida para el dígrafo será:

A E

B A E

C
B F
D
A B
E
D
F

Con esta estructura, podemos calcular fácilmente el grado de entrada de


cualquier vértice, solamente contando el número de nodos de la lista del vértice
requerido.
Ejercicios
1. elaborar la matriz de adyacencia para el siguiente dígrafo:

2. elaborar un función que reciba un grafo en una lista de adyacencia y dos


vértices V1 y V2. V1 y V2. son adjuntos. La función debe actualizar la lista
de manera que el arco formado por V1 y V2. desaparezca del grafo. Por
ejemplo dado el siguiente grafo

y los vértices ‘E’ y ‘D’, después del proceso , el grafo debe quedar en la
memoria del computador así

3. elaborar una función que reciba un grafo almacenado en una lista de


adyacencia y dos vértices V1 y V2. el arco entre V1 y V2 no existe. La
función debe actualizar la lista de adyacencia de manera que el arco que
puede construirse entre V1 y V2 quede incorporado en el grafo. por
ejemplo dado el siguiente grafo

y los vértices ‘A’ y ‘E’, el grafo debe quedar así:


4. elaborar una función que reciba un grafo en una lista de adyacencia, y
devuelva la correspondiente matriz de adyacencia.
5. elaborar una función que reciba un grafo en una lista de adyacencia y un
vértice. La función debe devolver un apuntador a la cabeza de una lista,
donde se almacenen todos los vértices no adjuntos al vértice recibido. Por
ejemplo dado el grafo

y el vértice B, la lista devuelva debe ser:

D E

6. elaborar una función que reciba un grafo o un dígrafo en una lista de


adyacencia. La función debe devolver 1 si es un grafo completo o 0 de lo
contrario.
7. elaborar una función que reciba un grafo en una lista de adyacencia y
devuelva 1 si el grafo es regular. Devolver 0 de lo contrario.
8. elaborar una función que reciba un grafo enana lista de adyacencia y
devuelva el número de arcos cíclicos del grafo.
9. elaborar una función que reciba un grafo o multigrado en una lista de
adyacencia (¿podría recibirse enana matriz?) y devuelva 1 si es grafo 0 2 si
es multígrafo.
10. elaborar una función que reciba una lista de adyacencia donde puede estar
almacenado un grafo, un multigrado o un grado con arcos cíclicos. La
función deber devolver 1 si la lista de adyacencia contiene un grafo simple.
Devolver 0 de lo contrario.
MATRIZ DE CAMINOS
Para la explicación de este tema, tomamos como ejemplo el siguiente grafo:

La pregunta y respuesta que se plantean en este numeral es la siguiente:


¿Cuántos caminos de longitud n existen ara llegar del vértice V, al vértice V1?
(Considere en este caso longitud n el numero de arcos que se deben recorrer.).
Concretamente, del vértice 1 al vértice 6 existen 3 caminos de longitud 2. Del
vértice 2 al vértice 3 existe 1 camino de longitud 3. En particular podemos
averiguar cuantos caminos de longitud 2 existen entre 1 y todos los demás.
Para este caso:
1 1 =4
1 2 =0
1 3 =1
1 4 =0
1 5 =0
1 6 =3
1 7 =0
1 8 =0
1 9 =0
1 10 =1
O, cuantos caminos de longitud 3 existen entre 6 y los demás vértices. APRA este
caso:
6 1 =0
6 2 =7
6 3 =0
6 4 =3
6 5 =6
6 6 =0
6 7 =1
6 8 =2
6 9 =7
6 10 =0
En general, podemos calcular cuantos caminos de longitud n existen entre
cualquier vértice y todos los demás.
Para calcular cuantos caminos de longitud n = 2 existen entre un vértice y todos
los demás, solamente es necesario calcular una multiplicación de matrices.
El procedimiento consiste en tomar la matriz de adyacencia M y multiplicarla por si
misma con el propósito de calcular los caminos de longitud n=2
N=M2
En la matriz N quedaría el resultado. Se esta es la matriz de adyacencia original
M

1 2 3 4 5 6 7 8 9 10
1 0 1 0 1 1 0 0 0 1 0
2 1 0 1 0 0 1 0 0 0 0
3 0 1 0 0 0 0 1 1 0 0
4 1 0 0 0 0 0 0 0 0 0
5 1 0 0 0 0 1 0 0 0 0
6 0 1 0 0 1 0 0 0 1 0
7 0 0 1 0 0 0 0 0 0 0
8 0 0 1 0 0 0 0 0 0 1
9 1 0 0 0 0 1 0 0 0 1
10 0 0 0 0 0 0 0 1 1 0

Si calculamos:
N = M2
Tenemos
1 2 3 4 5 6 7 8 9 10
1 4 0 1 0 0 3 0 0 0 1
2 0 3 0 1 2 0 1 1 2 0
3 1 0 3 0 0 1 0 0 0 1
4 0 1 0 1 1 0 0 0 1 0
5 0 2 0 1 2 0 0 0 2 0
6 3 0 1 0 0 3 0 0 0 1
7 0 1 0 0 0 0 1 1 0 0
8 0 1 0 0 0 0 1 2 1 0
9 0 2 0 1 2 0 0 1 3 0
10 1 0 1 0 0 1 0 0 0 2
Obsérvese este resultado. Comparando esta matriz con el grafo del ejemplo, nos
podemos dar cuenta de la validez del procedimiento. Por ejemplo, analizando el
número de caminos de longitud 2 para ir del vértice 1 al vértice 2, nos podemos
dar cuenta que la respuesta es 4:
1 2 1
1 4 1
1 5 1
1 9 1
De la misma manera para n=2, el numero de caminos para llegar del vértice 9 al
vértice 5 es 2
9 6 5
9 1 5
Para calcular el número de caminos de longitud 3 para llegar de un vértice a otro,
solamente es necesario efectuar la siguiente operación:
P=N*M
Partiendo del hecho de que en la matriz N esta M 2. O sea la secuencia de
instrucciones en el computador sería:
N = M* M
P = N *M
Después de efectuar esta operación, podemos ver la matriz de caminos para n=3.
veamos .
1 2 3 4 5 6 7 8 9 10
1 0 8 0 4 7 0 1 2 8 0
2 8 0 5 0 0 7 0 0 0 3
3 0 5 0 1 2 0 3 4 3 0
4 4 0 1 0 0 3 0 0 0 1
5 7 0 2 0 0 6 0 0 0 2
6 0 7 0 3 6 0 1 2 7 0
7 1 0 3 0 0 1 0 0 0 1
8 2 0 4 0 0 2 0 0 0 3
9 8 0 3 0 0 7 0 0 0 4
10 0 3 0 1 2 0 1 3 4 0
Ahora comparando esta matriz con el grafo original, nos damos cuenta de la
validez de los datos. Tomemos algunos ejemplos. El número de caminos de
longitud 3 para llegar de 8 a 10 es 3 :
8 10 9 10
8 10 8 10
8 3 8 10
El número de caminos de longitud 3 para llegar de 1 a 8 es 2
1 2 3 8
1 9 10 8
EJERCICIOS
1. Tomando el siguiente dígrafo

Calcule el numero de caminos de longitud n = 4 entre cualquier vértice y los


demás
2. dado el siguiente grafo:

Calcule el numero de caminos de longitud n = 5 cualquier vértice y los demás.


DIGRAFOS FUERTEMENTE CONECTADOS.
Un dígrafo esta fuertemente conectado, si desde cualquier vértice podemos llagar
a todos los demás. El propósito de este numeral, consiste en elaborar una función
que determine si un dígrafo dado cumple esta propiedad. Tomemos el siguiente
dígrafo:

Para saber si el dígrafo esta fuertemente conectado, es necesario calcular la


siguiente sumatoria de matrices
S= M+M2+M3+M3+……….Mnv-1
Donde nv indica el número de vértices del dígrafo. En M están almacenados los
caminos de longitud n=1 para llegar de un vértice a todos los demás:
M
1 2 3 4 5 6
1 0 1 0 0 0 1
2 0 0 0 0 1 0
3 1 0 0 1 0 0
4 0 1 0 0 0 0
5 0 0 0 1 0 0
6 0 0 1 0 0 0
En M2 están almacenados los caminos de longitud n=2 para llegar de un vértice a todos los
demás
1 2 3 4 5 6
1 0 0 1 0 1 0
2 0 0 0 1 0 0
3 0 2 0 0 0 1
4 0 0 0 0 1 0
5 0 1 0 0 0 0
6 1 0 0 1 0 0

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

Interpretando estos resultados podemos decir por ejemplo que para llagar del
vértice 5 al vértice 4 existen 2 caminos.
Como esta matriz almacena la suma S la Longitud de los caminos no se puede
considerar en este calculo.
La entrada S (4) (5) indica por lo tanto que entre el vértice 4 y el vértice 5 existe
camino ya que esa entrada es diferente de cero.
La entrada S (5)(3) como es cero, nos esta indicando que no existe un camino
entre el vértice 5 y el vértice 3.
Esta ultima observación, nos permite afirmar que el dígrafo no esta fuertemente
conectado.
Por lo tanto, podemos concluir que un dígrafo esta fuertemente conectado si
todas las entradas de la matriz S son diferentes de 0.
Para el siguiente dígrafo:
La matriz S, da como resultado

1 2 3 4 5 6
1 8 5 3 8 5 3
2 4 8 1 4 3 4
3 4 8 4 4 8 4
4 4 3 1 4 3 1
5 4 8 4 4 8 4
6 4 8 2 4 2 4

El dígrafo anterior esta fuertemente conectado ya que la matriz s no tiene ninguna


entrada con un valor 0, es decir existe camino entre cualquier vértice y todos los
demás.
Ejercicios
1. dado el siguiente dígrafo

Encontrar los errores que existen en la siguiente matriz de caminos:


S = M+M2+M3+M4+…………….+ M8

1 2 3 4 5 6 7 8 9
1 20 13 32 25 40 0 0 0 0
2 20 12 25 21 36 0 0 0 0
3 13 12 20 20 25 0 0 0 0
4 12 8 13 12 20 0 0 0 0
5 0 0 0 0 0 0 0 0 0
6 8 4 12 9 16 0 0 0 0
7 43 30 53 60 75 18 7 11 15
8 69 43 77 88 115 30 15 19 26
9 60 39 78 82 105 23 11 15 18

KKKKKKKKKKKKKKKKK
ÁRBOLES BINARIOS

En la vida cotidiana, muchas vedes sin saberlo, trabajamos en ocasiones con los
árboles. Por ejemplo: árboles genealógicos, organigramas, directorios en los
discos de un computador, etc. Cada uno de estos conceptos representa un árbol.

ORGANIGRAMA DE UNA EMPRESA

ORGANIZACIOND E UN DIRECTORIO EN UN COMPUTADOR

3.1.DEFINICIONES

En el área de la computación también se conoce una materia que trata de los


árboles. Este tema es muy extenso y para su estudio vamos a dividirlo en varios
capítulos.
En este capitulo nos vamos a circunscribir solamente en el estudio de los árboles
binarios. Este tipo de árbol se caracteriza porque tiene un vértice principal y de él
se desprende dos ramas. La rama izquierda y la rama derecha.
La rama izquierda y la derecha, también son dos árboles binarios. El vértice
principal se denomina raíz y cada una de las ramas se denomina árbol izquierdo y
árbol derecho. Por ejemplo:

La raíz de este árbol es A y el árbol izquierdo esta conformado por otro árbol.

Que a su vez tiene como raíz B. el árbol derecho esta conformado también por
otro árbol.

DEFINICIONES

NODO
Un árbol binario es un conjunto de elementos cada uno de los cuales se
denomina nodo. Un árbol binario puede tener cero nodos y en este se dice que
esta vació. Puede tener un solo nodo, y en este caso existe solamente la raíz del
árbol o puede tener un número finito de nodos. Cada nodo que esta ramificado
por la izquierda o por la derecha o puede no tener ninguna ramificación. La
anatomía de un nodo en un árbol binario es la siguiente:

O Información del nodo

Apuntador al árbol de la derecha


Apuntador al árbol de la izquierda O O
Raíz en un árbol binario se pueden distinguir la raíz principal y las raíces de los
demás subárboles. Por ejemplo:

La raíz principal es el nodo cuya información es A. podemos distinguir también el


árbol.

Cuya raíz es el nodo con información D. Este nodo es la raíz del árbol de la
derecha. El Árbol de la izquierda

Tiene como raíz el nodo cuya información es B y tiene solamente una


ramificación.
PADRE
Un padre es un nodo que puede o no tener ramificaciones. Por ejemplo:

Caso 1 caso 2 caso3

En los tres casos el nodo A es un padre. En el caso 1 es un padre que no tiene


hijos. En el caso 2, el nodo A es el padre del nodo B. en el caso 3 el nodo A es
padre de los nodos By C peo no es padre del nodo D.

HIJO
Nos referimos al ejemplo anterior. En el caso 1 el nodo A no tiene hijos. En el caso
2, B es un hijo del nodo A y en el caso 3, D es hijo de B y el padre de B es el nodo
A
HERMANO
Nos referimos al caso 3 del ejemplo anterior. Los hermanos son los hijos de un
mismo padre. Los nodos B y C son hermanos. El nodo D no tiene hermanos
HOJA
Una hoja es un nodo que no tiene ramificaciones. Por ejemplo

El nodo C es una hoja mientras que el nodo B no se puede considerar como hoja
porque tiene una ramificación por la derecha. El nodo D también es una hoja
NODO NO TERMINAL
Un nodo no Terminal es aquel que posee por lo menos una ramificación. En el
ejemplo anterior, el nodo A o el B son nodos no terminales, mientras el nodo D o
el nodo C son nodos terminales.
CAMINO
Un árbol siempre se examina hacia abajo. Por ejemplo:

Al nodo C podemos llegar desde el nodo B. Nunca se puede examinar el nodo B a


partir del nodo C. Los apuntadores derecho o izquierdo de cualquier nodo apuntan
al árbol derecho o izquierdo que siguen a ese nodo. Nunca apuntan a los nodos
precedentes. Un camino es el conjunto de nodos que tenemos que visitar con el
propósito de llegar a un nodo específico. Por ejemplo para llegar al nodo F es
necesario recorrer el camino
A D F
Del mismo nodo, para llegar al nodo G debemos recorrer el camino
A D E G
Obsérvese que los caminos se configuran siempre hacia abajo. Nunca se puede
hablar de un camino para llegar al nodo C así:
G E D A B C
Este camino se puede configurar.
LONGITUD
Longitud es el número de nodos que se deben recorrer para pasar de un nodo a
otro. Por ejemplo:
A

B
G

C D

F
E

La longitud entre A y E es 3. La longitud entre G y G es 0. La longitud entre A y B


es 1 Obsérvese que no podemos calcular la longitud entre B y G ya que el camino
B A G no existe.
DESCENDIENTE
El nodo C es descendiente del nodo A si a partir de A podemos llegar a C a través
de un camino. Por ejemplo:
El nodo C es descendiente de A ya que a C podemos llagar por el camino
A B C
Siempre que exista un camino para llegar de un nodo V a un nodo X, el nodo X es
un descendiente de V. pAra el ejemplo anterior, el nodo E es descendiente de D
pero el nodo no es descendiente de B
ANCESTRO
El nodo A es un ancestro del nodo C si existe un camino entre A y C. basándonos
en el ejemplo anterior. A es un ancestro de C ya que existe un camino entre los
nodos. No se puede hablar de que D sea ancestro de ya que el camino D A
B no existe
NIVEL
Cada nodo tiene un nivel dentro de un árbol binario. Por definición el nodo raíz
tiene un nivel y de los demás nodos tienen el nivel de su padre más 1. Por esto
los nodos que son hijos del nodo raíz tienen un nivel 1. Veamos este ejemplo

A M

B E N O

C D F P

G S

NIVEL 0 T
NIVEL 1 W
NIVEL 2
NIVEL 3

Los nodos A, M y S tienen un nivel 0 en tanto que los nodos G y V tienen un nivel
3. Obsérvese que le nivel del nodo G es la longitud del camino desde la raíz hasta
el nodo.
GRADO DE UN NODO
El grado de un nodo es el número de hijos. Por ejemplo el grado del nodo A es 2,
el grado del nodo T es 1. El grado de un nodo Terminal siempre es 0.en los
árboles binarios, el grado de un nodo fluctúa entre 0 y 2. Existen otros tipos de
árboles, (árbol n_ario), en los cuales esta restricción no existe. Estos arboles
serán estudiados en el segundo tomo de este libro
ALTURA
La altura de un árbol binario es el nivel de la hoja o de las hojas que están más
distantes de la raíz. Basándonos en el ejemplo anterior, la altura del árbol cuya
raíz es A, corresponde a la longitud del camino para llegar a la hoja más distante
de la raíz. En este caso será 3. La altura cuya raíz es M, corresponde al nivel de
la hoja P.
ARBOL BINARIO COMPLETO
Un árbol binario completo es aquel en el que todo nodo no Terminal tiene sus dos
hijos. El siguiente es un árbol binario de nivel 3:
NIVEL 0
A NIVEL 1
NIVEL 2
NIVEL 3

B
I

C
E J
M

D F G H
K L N O

Obsérvese que todos los nodos no terminales tienen sus dos hijos. El máximo
número de nodos que puede tener un árbol de nivel n es:
20 + 21 + 22 + 23….+ 2n
Si n es 3 entonces
20 + 21 + 22 + 23 =15
Este árbol es un árbol binario completo de nivel 3 y este es el máximo número de
nodos que puede tener un árbol de nivel 3.
ARBOL BINARIO IGUAL
Dos árboles son iguales si los dos son vacíos. Existe otro caso ene. Cual dos
árboles son iguales:

A A

B C B C

D D
Estos árboles son iguales porque sus raíces son iguales y también lo son su
respectivo árbol izquierdo y derecho. Para que un árbol sea igual a otro, es
necesario que el contenido de cada uno de sus respectivos nodos sea el mismo y
que legan las mismas relaciones de parentesco. Por ejemplo los siguientes
árboles

A A B

B C B E A F

D D D

Son diferentes porque el contenido de sus respectivos nodos es diferente.


Obsérvese que sus nodos tienen las mismas relaciones de parentesco.
ARBOL BINARIO SEMEJANTE
Dos árboles son semejantes si tienen el mismo número de nodos y los valores de
los nodos del primer árbol son los mismos que los valores de los nodos del
segundo, sin importar la relación de parentesco entre ellos. Por ejemplo:

A B C
C

B C A B A
A

Estos árboles son semejantes. Contienen


C los mismos valores enBcada uno de sus
nodos.
ARBOL BINARIO ISOMORFO
Dos árboles binarios son isomorfos si tienen la misma estructura aunque el
contenido de cada uno e sus nodos sea diferente. Por ejemplo los siguientes
árboles son isomorfos.

A
A

B C
B C

G
F E F
D E

H
D

PESO
El peso de un árbol en un nodo dado es el número de nodos en el árbol sin
contarse el mismo. Por ejemplo:

A P

B C Q
R

D E S T U V

El peso del árbol cuya raíz es A corresponde al número de nodos de ese árbol: los
nodos Q,C y R tienen un peso de 2
FORMAS DE RECORRER UN ARBOL BINARIO
Universalmente existen 3 formas de recorrer un árbol binario:
 Preorden
 Inorden
 Posorden
Si logramos construir un árbol como este:
Podemos extraer sus datos de 3 maneras. Veamos cada una. Recorrer un árbol
en preorden consiste en:
 Examinar el ato del nodo raíz
 Recorrer el árbol izquierdo en preorden
 Recorrer el árbol derecho en preorden
Si deseamos recorrer todo el árbol, evidentemente debemos comenzar por el
nodo raíz. Este método exige examinar primero el nodo raíz debemos entender
como examinar un nodo, el hecho de efectuar sobre su información cualquier
acción: por ejemplo escribirla, efectuar alguna operación matemática sobre ella o
con ella, modificarla. También en la gran mayoría de los textos de estructuras de
información, se utiliza el termino visitar un nodo. Entre la palabra examinar y la
palabra visitar existe una diferencia. Examinar un nodo es revisar su contenido y
eventualmente modificarlo en tanto que visitar un nodo es utilizar la dirección de
ese nodo con el propósito de seguir explorando el árbol hacia abajo. Si deseamos
recorrer un árbol en preorden, con el propósito de escribir su contenido, debemos
examinar el contenido de cada uno se sus nodos, mientras si deseamos contar
sus nodos, es necesario visitar cada nodo.
Supongamos que deseamos escribir un árbol en preorden. Para hacerlo, se debe
examinar el nodo raíz y luego recorrer el árbol de la izquierda en preorden.

E
D
ARBOL A LA IZQUIERDA DE A
Recorrer este árbol en preorden es examinar su nodo raíz y recorrer de nuevo el
árbol de la izquierda preorden.

D
ARBOL A LA IZQUIERDA DE B
Recorrer este árbol en preorden es examinar su nodo raíz. Como ya no existen
nodos por la izquierda, debemos empezar a recorrer el árbol D por la derecha.
Como ya no existen nodos por la derecha, debemos recorrer el árbol.

E
D
Por la derecha. El árbol de la derecha lo debemos recorrer también en preorden.

E
ARBOL A LA DERECHA DE B
Recorrer este árbol en preorden, es examinar su nodo raíz y recorrer el árbol por
la izquierda en preorden y luego recorrerlo por la derecha. Como no existen
árboles ni por la izquierda ni por la derecha, debemos recorrer el árbol.

F G
En preorden. El orden en el cual debemos examinar estos nodos es: primero el
nodo C, luego F y luego G. por lo tanto al imprimir el árbol anterior en preorden,
los resultados deben ser:
A B D E C F G
Antes de seguir adelante, el lector debe certificar que el árbol:

1
0

5 1
5

3 1
7 4 1
7

Al imprimirlo recorriéndolo en Preorden debe generar los siguientes resultados:


1 4 99 1 2
10 5 3 1 4 7 15 14 17 6 16 20 0
B
Ahora veamos la segunda forma de recorrer un árbol binario. Recorrer un árbol en
inorden, consiste en:
Recorrer el árbol izquierdo en inorden
Examinar la raíz
Recorrer el árbol derecho en inorden.
Por ejemplo:

B C
Si queremos imprimir este árbol en inorden, debemos primero recorrer el árbol
izquierdo en inorden:
Al tratar de recorrer este árbol en inorden y no existe árbol por su izquierda
debemos examinar el nodo y luego recorrer el árbol de su derecha. Al no existir
árbol por su derecha, entonces el árbol a la izquierda del nodo A ha sido
totalmente recorrido. Siguiendo con las normas establecidas inicialmente,
debemos examinar el nodo A y luego recorrer el árbol a la derecha del nodo A

C
ARBOL DERECHO DE A
Para recorrer este árbol en inorden primero debemos recorrer el árbol izquierdo.
Al no existir árbol izquierdo, se debe examinar este nodo y luego recorrer el árbol
derecho. Al no existir árbol derecho, el árbol ya ha sido recorrido en su totalidad.
Por lo tanto los datos impresos serán:
B A C
Observemos este otro ejemplo

1
0

5
1
2

3 7 1 1
Debemos recorrer en inorden el árbol a la izquierda
1 de la5raíz:

3 7
Al recorrer este árbol en inorden ya sabemos, de acuerdo a la explicación del
ejemplo anterior, que los resultados son:
3 5 7
Al terminar de recorrer el árbol a la izquierda de la raíz, debemos examinar la raíz
y luego recorrer en inorden el árbol a la derecha de la raíz

1
2

1 1
1 5
Sabemos que al recorrer este árbol en inorden, los resultados son:
11 12 15
Con lo cual al examinar todo el árbol en inorden, los datos impresos serán:
3 5 7 10 11 12 15
Se invita al lector a certificar que al recorrer el siguiente árbol binario en inorden
los resultados son:
H D I B E A J F C K G L
Veamos el árbol

B C

D E F G

I J L
H K

Por ultimo estudiemos la tercera forma de recorrer un árbol binario. Examinar un

árbol binario en posorden consiste en:

 Recorrer el árbol izquierdo posorden

 Recorrer el árbol derecho en posorden

 Examinar la raíz.

Veamos un ejemplo:
A

B C

Al recorrer el árbol izquierdo en posorden, el único dato impreso será B. después

de haber recorrido todo el árbol de la izquierda en posorden, se debe recorrer

todo el árbol de la derecha en posorden. Al recorrer el árbol de la derecha en

posorden, el único dato impreso será C. una vez recorridos los árboles izquierdo y

derecho, debemos examinar la raíz. Según esto los datos impresos serán.

B C A

Ejercicios
5. Elaborar un programa que cree en la memoria del computador el siguiente
árbol binario:

B C

D E

6. Dado el siguiente árbol binario:

B C

D E

F G I J
Certificar que al recorrer el árbol, los siguientes resultados son correctos:

Preorden ABCDFGEIJ

Inorden BAFDGCIEJ

Posorden BFGDIJECA

7. Suponga que en memorial del computador existe el siguiente árbol:

B C

D
E

Escriba un conjunto de instrucciones que cree un nodo X a la derecha de B y un


nodo Y a la derecha de E.
8. dado el siguiente árbol: raíz

R
Q

U V
S T

W X Y
Z
Cuales serian los datos impresos si se recorre en:
Preorden
Inorden
Posorden

MANTENIMIENTO DE UN CONJUNTO DE NUMEROS CLASIFICADOS


ASCENDENTEMENTE, UTILIZANDO UN ARBOL BINARIO ORDENADO.
Utilizando un árbol binario, es posible mantener un conjunto de números
clasificados ascendentemente sin necesidad de rutinas de ordenamiento. Se
plantea el problema de leer un conjunto de enteros y listarlos clasificados
ascendentemente.
Los números repetidos deben ser rechazados. Por ejemplo si la entrada es:
87 25 23 25 48 8 92
El programa debe generar los siguientes resultados:
8 23 25 48 87 92

Este problema se puede resolver fácilmente utilizando un árbol binario ordenado.


Solamente es necesario ir leyendo cifra por cifra e ir adicionándola en el árbol así:
si es menor al contenido del nodo analizado la instemos por la izquierda de ese
nodo y se es mayor por la derecha. Veamos: al leer el número 87, creamos con
este dato el nodo raíz. Luego al leer el 25, como 25 es menor que 87, creamos un
nuevo nodo a la izquierda de 87. Visualmente el árbol creado hasta el momento
sería:

8
7

2
5
Luego al leer el número 23, como este dato es menor a 87, nos debemos
desplazar hacia abajo por la izquierda. Al llegar al 25, debemos crear un nuevo
nodo a la izquierda por el hecho de que 23 es menor que 25, así:

8
7

2
5

2
3
Al leer el siguiente dato este debe ser rechazado porque ya existe en el árbol. Al
leer el 48, debemos desplazarnos por la izquierda y al compararlo con 25, se
debe crear un nuevo nodo a la derecha del 25, así:
8
7

2
5

2 4
3 8

Siguiendo este mismo procedimiento, enumero 8 debe insertarse a la izquierda


del 23 así

8
7

2
5

2 4
3 8
8

Por ultimo al leer el numero 92 este debe insertarse a la derecha del 87. Los
datos en el. Árbol quedan, finalmente, distribuidos así:

8
7

9
2 2
5

2 4
3 8

Si imprimimos el contenido del árbol, recorriéndolo en inorden. Tendremos la lista


pedida:

8 23 25 48 87 92
IMPRESIÓN DE UN ARBOL EN INORDEN
Observemos el siguiente árbol:
Raíz

1
0

5
1
5

3 7 2
0
Al escribir este árbol en inorden los resultados serán:

3 5 6 7 8 10 15 20
Observando el proceso, lo primero que se escribe siempre es el contenido del
nodo de la extrema izquierda del árbol. Luego debemos escribir el contenido del
nodo padre para luego escribir en inorden el árbol de la derecha.

IMPRESIÓN DE UN ARBOL EN PREORDEN USANDO UNA PILA

Deseamos escribir un árbol en preorden. Veamos esta estructura:

R 10
0

A 5
0 15 G
0

B 3 I
0 6 E 12
0 0 16
H 0

1 D 4 6 F J
0 0 5 18
0
La función que vamos a elaborar debe escribir:
100 50 30 10 40 60 65 150 120 160 180
Esta nueva función se diferencia de a función inorden ( ), en que en aquella
primero se recorría el árbol izquierdo y luego si se escribía el contenido del padre
de ese árbol. En esta nueva rutina primero se debe escribir el contenido del padre
del árbol y luego se recorrer en preorden la rama izquierda.
El siguiente paso consiste en retirar de la pila la dirección C y determinar si existe
un árbol por la derecha del nodo indicado por C. siguiendo el comportamiento de
la pila, podemos por esto, deducir que esta función es muy parecida a la función
inorden ( ). La diferencia radica en que antes de analizar el árbol izquierdo, la
información del nodo ya ha sido escrita. Veamos el comportamiento del proceso:

Contenido la pila numero escrito


100
1 R

50
2 R A

3 R A B
30
3 R A B C 10

3 R A B
-

2 R A
-

3 R A D 40

2 R A
-

2 R E 60

3 R E F 65

2 R E -

1 R -

1 G 150

2 G H 120

1 I -

1 J 180
0
-

IMPRESIÓN DE UN ARBOL EN POSORDEN USANSO UNA PILA


La impresión de un árbol en posorden, es un poco más compleja y requiere de
modificaciones en el manejo de la pila Veamos este árbol:

1
0

5
3
0

3 7 2 4
0 0
La impresión en posorden es:

3 7 5 20 40 30 10
Antes de imprimir el nodo, debemos recorrer el árbol izquierdo y luego el derecho.
Es claro que primero debemos llegar hasta la hoja de la extrema izquierda del
árbol, guardando los apuntes en una pila para luego poder recuperar las
direcciones de todos los ancestros de esa hoja. Se llegamos a la hoja:

3
Antes de escribir el contenido del nodo debemos certificar que ya han sido
recorridos en posorden los árboles izquierdo y derecho.

IMPRESIÓN DE UN ARBOL POR NIVELES USANDO UNA COLA


Imprimir un árbol por niveles, es imprimir primero su raíz, luego los contenidos de
los nodos del nivel 1, luego los contenidos de los nodos del nivel 2, y así
sucesivamente hasta imprimir el contenido de los nodos del ultimo nivel. Por
ejemplo:
2
0

1
0 3
0

5 1 2 4
5 5 0

Al imprimir este árbol por


7 niveles, los resultados serán: 5
20 10 30 5 15 25 40 7 500
Aprovechando una estructura FIFO, podemos efectuar esta impresión sin ningún
problema.
Al comenzar almacenamos en una cola la dirección del nodo raíz:

Ahora mientras la cola no este vacía, retiramos el primer elemento de la cola y


escribimos el contenido de la dirección del elemento retirado e insertamos en la
cola las direcciones izquierda y derecha almacenadas en el contenido de la
dirección retirada de la cola

B C

Siguiendo este mismo procedimiento, tendríamos los siguientes estados de la


cola:
10 C D E

30 D E F G

5 E F G H

F G H
15

25 G H

40 H I

7 I

50 H

Revisando el proceso anterior, observamos dos cosas: la primera es que cuando


un apuntador es NULL, a la cola no se adiciona ningún elemento y la segunda es
que este proceso repetitivo se debe efectuar mientras la cola no esté vacía.
RECONSTRUCCION DE UNA RBOL BINARIO
Se plantea el problema de reconstruir un árbol binario dados sus recorridos en
preorden y en inorden. Por ejemplo, si un árbol genera lo siguiente: al recorrerse
en preorden:
G E A I B M C L D F K J H
Y genera lo siguiente al recorrerse en inorden:
I A B E G L D C F M K H J
Se requiere de un programa que a partir de estos datos, genere un árbol binario al
cual correspondan las dos impresiones. Vamos a considerar que a la función que
elabora este trabajo entran dos arreglos. El método es muy sencillo y consiste en
utilizar una estructura LIFO como la herramienta fundamental. Lo más sencillo del
proceso es determinar la raíz del árbol. Para el caso que nos ocupa la raíz será:

Vamos a utilizar los apuntadores p y q como auxiliares de trabajo.

Pre G E A I B M C L D F K J H
In I A B E G L D C F M K H J
Si se recorre este árbol en Preorden, el primer nodo que visita es G y al recorrerlo
en inorden el nodo del extremo izquierdo es I. en este lugar podemos afirmar que
los nodos EAIB, forman el sub.-árbol izquierdo de G y los nodos MCLDFKJH el
sub.-árbol derecho q

Raíz p
G

El problema esta dividido en dos. Ya sabemos que la raíz es G y también


EAIB MCLDFKJH
sabemos los componentes de la izquierda
IABE y de la derecha. Ahora podemos
LDCFMKHJ
guardar en una pila los componentes del árbol derecho y seguir trabajando sobre
el árbol izquierdo. Es decir tratar de organizar el árbol izquierdo.
La pila quedara así:

1 MCLDFKJH G
LDCFMKHJ

Vamos a considerar la G del recuadro como un apuntador que esta en la pila que
nos indica la dirección del nodo padre de este sub.-árbol derecho. Ahora debemos
seguir trabajando con el sub.-árbol izquierdo.
EAIB

IABE

De la misma forma, el nodo raíz de este nuevo árbol es E. este nodo debe
conectarse al nodo G así

E
Q
El apuntador que siempre debe estar dirigido al nodo al cual se conectara el
nuevo nodo posteriormente. Siempre el nuevo nodo será indicado por el
apuntador p. con lo anterior el árbol estará organizado así:

E MCLDFKJH
LDCFMKHJ

AIB
IAB

Obsérvese con cuidado porque el nodo E no tiene sub-árbol derecho. Siguiendo


el mismo orden, debemos crear un nodo A, el cual conectara por la izquierda con
E y este nodo si tendrá sub- árbol por la derecha, así:

E MCLDFKJH
LDCFMKHJ

I B
I B

Como siempre que aparezca un sub-árbol derecho debemos actualizar la pila , su


nueva información será:

1 MCLDFKJH G B A
LDCFMKHJ B
Siguiendo por la izquierda, ahora podemos conectar el nodo I, quedando el árbol
así:
G

E MCLDFKJH
LDCFMKHJ

I B
B
En este lugar debemos efectuar un retiro de la pila y conectar el nuevo nodo por
la dercha del nodo indicado por el apuntador que estaba almacenando en el
primer elemento de la pila.
Con esto, el arbol queda así:
G

E MCLDFKJH
LDCFMKHJ

I B

Y la pila contendrá solamente un elemento. Como ya se distribuyo la información


el árbol izquierdo, debemos retirar de la pila el elemento y conectar por la derecha
un nuevo nodo M, quedando el árbol así:
G

E M
CLDF KJH
I A B LDCF KHJ
La nueva información de la pila será.

1 KJH M
KHJ

Y continuamos trabajando con el árbol izquierdo. Siguiendo hacia la solución,


debemos crear un nodo C y guardar en la pila el sub-árbol derecho que se
conectara al nodo C posteriormente.

E M

A KJH
C KHJ

LD F
I B LD F

La pila hasta el momento tendrá estos datos:

1 KJH M F C
KHJ F

Acercándonos un poco mas hacia la solución, el árbol se puede ver así:

E M

D F KJH
I A B L DC F KHJ
Y la pila almacenara la siguiente información:

1 KJH M F C D L
KHJ F D

Obsérvese que siempre que se identifique un sub-árbol derecho, la pila debe ser

actualizada. Como ya se acabo la información a distribuir por la izquierda,

debemos efectuar un retiro de la pila, con el propósito de seguir el proceso.

Efectuando este retiro y sabiendo el nodo al cual debemos conectar el nuevo

nodo por la derecha, podemos hacer adecuadamente la inserción del nuevo nodo.

El primer elemento de la pila es:

D L
D

Esto quiere decir que el nodo D se debe conectar a la derecha del nodo L, así:

E M

A KJH
C KHJ

F
I B L D F
De la misma manera, el nodo F debe conectarse a la derecha del nodo C.

Después de conectar el nodo F, debemos retirar de la pila el último elemento y

comenzar a distribuir por la izquierda la nueva informaron. Veamos el arbol hasta

este momento:
G

E M

A
C K

L F JH
I B HJ

D
Y la pila contendrá la siguiente información

1 JH L
HJ

Ahora al haber distribuido la rama izquierda (no existe rama izquierda e K ),


podemos retirar de la pila su único elemento y crear un nodo J e insertar en la pila
su rama derecha, ( no existe rama derecha), así:

E M

I A B L DC F HK J
Al observar el proceso, vemos que la pila queda vacía y falta adicionar al árbol el
nodo H. con esto podemos afirmar que el proceso se debe efectuar mientras la
pila no este vacía o exista información para distribuir por la rama izquierda. Por lo
tanto el árbol final será:
G

E M

A
C K

L F J
I B

D H

Existe un buen número de formas para construir una función que efectué el
proceso anterior. A continuación presentamos una de estas versiones codificada
en lenguaje C.
NOTACIONES INFIJO, POSFIJO Y PREFIJO
Cuando se nos pregunta, por ejemplo, cuanto es el resultado de 5 multiplicado por
8 más 3, la respuesta automática que se da es 43. No se da el caso de que la
respuesta dad sea 55. Ahora si pregunta es: cual es la respuesta de 3 mas 5
multiplicado por 8, también volveremos a dar la misma respuesta: 43. No se nos
ocurre sumas 3 y 5 luego multiplicar la respuesta por 8 para que nos de 64. Se
nos pregunta cual es la respuesta de 5 por 2 mas 8 por 3, la respuesta dada es
34. Nos hemos acostumbrado a través del tiempo a que el operador * tiene mas
prioridad que el operador + y así lo trabaja cerebro. La notación con la cual
trabajamos los humanos este tipo de expresiones se denomina infijo, donde la
presencia de los operadores es:

* /
- +
=
Los humanos trabajamos con notación infijo. De la misma manera los
computadores están diseñados para que reconozcan la misma prioridad que
reconocemos los humanos. La instrucción:
Resol = 5 * 2 + 8 * 3;
Deja almacenada, por ello, la cifra 34, ya que la asociación automática es:
(result: (5 * 2)+(8 * 3));
Si deseamos que un computador, o un ser humano, calcule:
Resul= 5 * 2 + 8 * 3;
Pero sumando 2 y 8 primero, debemos diseñar la instrucción así:
Result= 5 * (2 + 8) * 3:
Se utilizan los paréntesis para modificar la prioridad de los operadores.
Un programador al indicarle esta instrucción a un computador:
Resul= 5 * 2 + 8 * 3;
Espera la respuesta 34 pero no le interesa como lo hizo la maquina.
Internamente, esta operación la ejecuta utilizando una pila. La operación la
ejecuta reconociendo objeto a objeto. Vamos a ilustrar la transformación que debe
hacer la maquina con el propósito de efectuar la operación anterior. De lo único
que esta enterada tanto la maquina como el programador, es que el operador *
tiene mas prioridad que el operador +. La transformación que se realiza es
convertir la expresión de notación infijo a notación posfijo lo cual se estudiará en
el siguiente numeral. A continuación estudiaremos que es la notación posfijo.
La notación posfijo, es otra manera de escribir una expresión aritmética. La
notación posfijo, se caracteriza por la ausencia de paréntesis. Esta notación,
aunque nunca utiliza paréntesis, es presentada sin ningún tipo de ambigüedad.
Veamos su naturaleza. Si tenemos una expresión en notación infijo. Por ejemplo:
a +b
Para escribir esa misma expresión en posfijo. Se debe ejecutar los siguientes
pasos:
3. agrupar utilizando paréntesis, de acuerdo a la prioridad de los operadores,
así:
(a+b)
4. escribir en posfijo la expresión, así:
ab+
Obsérvese que en la notación posfijo, el operador se escribe después de los
operadores . Veamos otro ejemplo:
a+b*c
Agrupando tenemos:
a+(b*c)
Convirtiendo a posfijo la expresión entre paréntesis resulta:
a+(bc*)
Ahora tratando la expresión entre paréntesis como un operador tenemos
a ( b c * )+
y destruyendo los paréntesis, nos queda la expresión escrita en posfijo:
abc*+
Veamos este ejemplo;
(x*y)+(v*w)
Primero debemos convertir las expresiones encerradas entre paréntesis a
notación posfijo, así:
(xy*)+(vw*)
Y luego toda la expresión a notación posfijo, así
xy*vw*+

Veamos estos ejemplos:


8. (a+b)*( c+d) (ab+)*(cd+) ab+cd+*
9. a+b-c (ab+)-c ab+c-
10. (a+b)*(c-d)*e*f ((( a b + ) * ( c d - )) * e ) * f
(( a b + c d - * ) * e ) * f
(ab+cd-*e*)*f
ab+cd-*e*f*
11. (a+b)*(c/(d-e)+f)-g
(ab+)*(c/(de-)+f)-g
( a b + ) * ( ( cd e - / )+ f ) – g
(ab+)*(cde-/f+)-g
ab+cde-/f*g–
12. vamos a suponer que la operación exponenciación esta definida y la
representamos así: además, tiene la mayor prioridad de todos los
operadores. Veamos estos ejemplos, usando este nuevo operador:
(a b c) (a b) c ab c
13. a b * c – d + e / f/ (g+h) ((a b) * c – d ) + ( e / f ) / ( g+ h )
(ab c * d - ) + ( ef / gh + / )
ab c * d – ef / gh + / +
14. a + ((( b – c ) * ( d – e ) + f ) / g ) (h – j )
a + ((( bc - de - * f + ) / g ) (hj - )
a + (( bc – de - * f + a / hj- )
abc – de - * f + g / hj- +
Existe otro tipo de notación para escribir las expresiones aritméticas. Esta nueva
notación recibe el nombre de prefijo y recaracteriza porque los operadores se
escriben primero que los operadores. Por ejemplo la expresión:
a+b
Escrita en notación prefijo, sería:
-ab
En general todas las reglas para convertir infijo a posfijo, se aplican para efectuar
las conversiones infijo a prefijo, tendiendo en cuenta que los operadores se
escriben antes que los operadores. Veamos estos ejemplos:

6. a+b+c (a-b)+ (+ab)+c


++abc
7. a+b-c (a-b)-c (+ab)-c
-+abc
8. (a+b)*(c-d) (+ab)*(-cd)
*+ab-cd
9. a+b/c-d a+(b/c)-d
(a+(/bc))-d
(+a/bc)-d
- + a / bcd
10. a b*c-d+e/f/(g+h)
(((a b) * c ) – d ) + ( e/f ) / (g+h)
( - * abcd) + ( / ef ) / ( + gh)
- * abcd + (//ef + gh)
+ - * abad //ef+gh
Podemos también plantear algunos ejemplos para convertir de posfijo a prefijo o
infijo. Veamos primero algunos ejemplos para convertir de posfijo a infijo:
7. ab+
El operador se debe aplicar a los últimos dos operandos, quedando así:
a+b
8. ab+c-
El análisis se comienza por la izquierda de la expresión. Se debe recorrer
la expresión hasta que encontremos un operador, así:
ab+c-
Una vez hayamos encontrado el primer operador, debemos aplicar ese
operador a los dos últimos operandos que lo precedan, así
(a+b)c-
Y luego debemos seguir analizando la expresión hasta encontrar el
próximo operador:
(a+b)c-
Una vez hayamos encontrando el próximo operador debemos aplicar ese
operador a los últimos dos operandos. Obsérvese que la expresión
encerrada entre paréntesis, se debe trabajar como un solo operando.
(a+b)-c
9. ab+cd-*
Siguiendo el proceso anterior, tenemos:
(a+b)cd-*
(a+b)(c-d)
(a+b)*(c-d)
10. ab+cd-*e*f* (a+b)cd - * e * f *
(a+b)(c-d)e * f *
((a+b)*(c-d)*e) f *
((a+b)*(c-d)*e) * f
(a+b)*(c-d) * e * f
11. ab c (a b)c
(a b)c a b c
12. ab c*d-ef / gh+/+
(a b*c)d-ef / gh + / +
(a b*c-d)ef / gh + / +
(a b* c-d)(e/f) gh + / +
(a b*c-d)(e/f)(g+h) / +
(a b*c-d)((e/f)/(g+h)) +
(a b*c-d)+(e/f)/(g+h)
A b*c-d+e / f / (g+h)
De la misma manera, podemos pasar de la notación prefijo a la notación infijo;
veamos un ejemplo
+ab
En este caso debemos analizar la expresión de derecha a izquierda hasta que
encontremos el primer operador. Una vez lo hayamos encontramos, aplicamos
este operador a los dos operandos que le siguen, así:
a+b
Veamos algunos ejemplos:
4. -+abc -(a+b)c
(a+b)-c a+b-c
5. *+ab - cd * + ab(c-d)
* (a+b) (c-d)
(a+b) * (c-d)

6. -*+abc - de -fg -*+abc – de (f-g)


-*+abc (d-e) (f-g)
-*(a+b)c(d-e)(f-g
-((a+b)*c)(d-e)(f-g)
(((a+b)*c)-(d-e))(f-g)
((a+b)*c-(d-e)) (f-g)
EJERCICIOS
5. cada una de las siguientes expresiones escritas en fijo convertirlas a posfijo
a) (x+y)*(z (s+t)+u)-v
b) a+((x+y)*(w+v)) (i+j)
6. Convertir las expresiones del ejercicio anterior a prefijo
7. Convertir las siguientes expresiones de prefijo a infijo:
a) + - xyz*i**klm
b) ++1-* mno/+pq*rst
8. Convertir las siguientes expresiones en posfijo a infijo
a) pqrst-+ *uv*-
b) lm-n+opq-+
REPRESENTACION DE EXPRESIONES ARITMETICAS EN ÁRBOLES
BINARIOS
Una expresión aritmética puede expresarse utilizando un árbol binario. Por
ejemplo la expresión:
a+b
Expresada en un árbol binario es:

a b

El operador +aplica a los operandos de la rama izquierda y la rama derecha. La


expresión:
a+b*c
Quedara expresada así:
+

A *

B C

El árbol queda organizado así ya que la expresión implícitamente esta asociada


así:
a+(b*c)
Porque por definición el operador * es de mayor jerarquía que el operador +
Vamos a construir un árbol par ala expresión:
a/b* c+ d e*f
para defecto esta expresión escrita en infijo, asocia sus operandos así:
(( a / b ) * c ) + (( d e ) * f )
Esto indica que la raíz del árbol contiene el operador+. La rama izquierda contiene
la expresión (a / b ) * c y la rama derecha la expresión (d e )*f. siguiendo este
orden de ideas el árbol queda construido así:

* *

/ C F

A B D E

Existe un método sencillo para construir una árbol que representa un a expresión.
El primer paso consiste en transformar la expresión de infijo a prefijo y partiendo
de la expresión escrita en prefijo construir el árbol. Veamos algunos ejemplos:
Infijo a+b
Prefijo +ab
Al tener la expresión en prefijo, fácilmente se puede construir el árbol siguiendo
este método:
Se insertan nuevos nodos por la izquierda del árbol que hayamos insertado un
operando

A
+a

Luego volvemos hacia atrás en el árbol e insertamos el siguiente elemento a su


derecha.

A B +ab
Si el nodo insertado fue un operador, insertamos el siguiendo a su izquierda. Si el
nodo insertado fue un operando, volvemos hacia atrás e insertamos el siguiente
nodo a la derecha. Este proceso se continúa hasta que se agote la expresión
escrita en prefijo. Veamos otro ejemplo:

Infijo a+(a*c d)
Primero debemos convertir la expresión a prefijo:
+a*b cd
Luego debemos insertar nuevos nodos hasta encontrar un operando:

A +a

Luego volvemos hacia atrás e insertamos el siguiente elemento a la derecha:

A *
+a*

Como el último nodo insertado fue un operador, debemos insertar el siguiente a la


izquierda:

A *

B
+a*b
Como el nodo mas reciente insertado fue un operando, volvemos hacia atrás e
insertamos el siguiente a la derecha.

A * +a*b

Como el último nodo insertado fue un operador, debemos insertar el siguiente a la


izquierda:

A *

B +a*b c

Como el nodo más reciente insertado fue un operando, volvemos hacia atrás e
insertamos el siguiente a la derecha:

A *

B
+a*b cd

C D
Siguiendo este método, y antes de seguir adelante, se recomienda al lector
revisar los árboles para las siguientes expresiones en prefijo:

+ D

A *

B C

+ D E F

A *

B C
CONVERSION DE UNA EXPRESION EN UN ARBOL BINARIO A SU
REPRESENTACION INFIJO
En este numeral se desarrollara una función que a partir de un árbol binario,
genere un arreglo que almacene la expresión en infijo. Antes de entrar
propiamente en el desarrollo del problema, estudiaremos algunas propiedades de
estos árboles. Supongamos que tenemos en la memoria del computador un árbol
así:

A *

B C

Este árbol representa la siguiente expresión


a+b*c
La expresión anterior escrita en prefijo será:
+ a * bc
Si recorremos el árbol en preorden los datos generados serán:
+a*bc
Lo anterior nos permite plantear la primera propiedad:
Si se recorre un árbol en preorden, los datos generados representan la expresión
escrita en prefijo.
Si el árbol anterior recorremos en posorden, los datos generados serán:
abc*+
Estos datos representan la expresión
a+b*c
Escrita en posfijo, lo cual nos permite plantear la segunda propiedad:
Si se recorre un árbol en posorden, los datos generados representan la expresión
escrita en posfijo.
Es de esperarse que si recorremos el árbol en inorden, la expresión generada
estará escrita automáticamente en infijo. Veamos:
a+b*c
Para el caso que nos ocupa se cumplió la norma. Veamos otro ejemplo:
(a+b) c/d+e
Esta expresión escrita en prefijo será:
+/ +abcde
Y en posfijo será:
ab+c d/e+
y el árbol generado será:

/ E

+ C

A B
B
Al recorrerlo en preorden, los datos generados serán:
+/ +abcde
Al recorrerlo en posorden, los datos generados serán:
ab+c d/e+
Las dos propiedades anteriores se cumplen. Se recorremos el árbol en inorden
los datos generados serán:
a+b c/d+ e
Pero esta expresión, para su evaluación, se asocia así:
a+((b c)/ d)+e
Y es bien diferente da la inicial, la cual era:
(a+b) c/d+e
Lo cual nos permite plantear la siguiente propiedad:
Si se recorre un árbol en inorden, los datos generados no representan la
expresión escrita en infijo.
Si queremos que de un árbol se genere la correspondiente expresión en infijo no
basta con recorrerlo en inorden, además debemos efectuar un proceso que
parentice la expresión. Para el ejemplo, el recorrido inorden del árbol es:
a+b c/d+e
Como el operador tiene más prioridad que los demás, y el operador / tiene más
prioridad que el +, al tratar de evaluar la expresión esta se asocia así:
a+((b c)/d)+e
Debemos diseñar un proceso que genere un arreglo infijo con los siguientes
datos:

( A + B ) C / D + E

Lo cual implica que en la medida en que generamos este arreglo debemos ir


incluyendo paréntesis donde sea necesario. Veamos la naturaleza del problema:

/ E

+ C

A
Como el operador B aplica a los dos subárboles, gráficamente el árbol
de la raíz
B
anterior lo podemos representar así: +

/ E

D
A + B C
2

Si cada cuadro representa un par de paréntesis, este árbol lo podríamos escribir


así:
(rama izquierda )+e
((rama izquierda )/)d)+e
(((rama izquierda ) c ) /d)+e
((((rama izquierda) + b) c ) / d ) +e
((( a ) + b) c ) / d + e
Ahora retiramos los paréntesis innecesarios, debidos a la jerarquía de los
operadores, tendremos la expresión:
((( a +b) c ) / d ) + e
No podemos retirar los paréntesis que encierran la expresión (a+b), debido a que
se cambia la expresión ya que el operador es de mayor prioridad que el
operador +. Los paréntesis ya encierran la expresión (a+b) c si se puede retirar,
debido a que el operador es de mayor jerarquía que el operador /
((a+b) c/d)+e
Los paréntesis que encierran la expresión (a+b) c / d pueden ser retirados ya
que el operador + es el de al mínima jerarquía. Con la cual la expresión
debidamente patentizada es:
Veamos otro ejemplo:

+ C

A B
B
Si recorremos el árbol en inorden, los resultados serán:
a+b c
Lo cual es diferente a la expresión que esta representada en el árbol.
(a+ b ) c
Si el árbol es:

A B
B
Al recorrerlo en inorden los resultados son:
a b+c
y no existe la necesidad de insertar paréntesis en la expresión. La diferencia, en
este caso particular, radica en que si el operador padre tiene más jerarquía que el
operador hijo, debemos patentizar la rama izquierda o derecha del árbol.
Observemos los siguientes árboles:
+

+ C C

A B A B
B - B

- C

A B
B
Para el árbol A la expresión será:
(a+b) c B

Debe patentizarse. El operador tiene mas jerarquía que el operador +

B
Para el árbol la expresión será:
a b+c
no se necesitan paréntesis. El operador + tiene menos jerarquía que el operador

Para el árbol C la expresión será:


(a-b)-c
Para esta expresión., no son necesarios los paréntesis ya que sin ellos la
asociación se haría de la misma manera. Veamos este caso.

-
C

A B
B

Para este caso al recorrer el árbol en inorden, se genera la siguiente expresión:


c–a–b
Se deben insertar paréntesis ya que es muy diferente la expresión que está
representada en el árbol:
c – (a - b )
Ahora debemos puntualizar en que momento se necesitan insertar paréntesis.
La respuesta es muy sencilla. Veamos este ejemplo

*
+ /

+ C
A -

B C B C
Al recorrer el árbol en inorden, el resultado será:
a+b-c d+e*f
Debemos insertar paréntesis a la expresión a+b-c y también a la expresión d+e*f.
al final arreglo infijo quedara así:
(a+b–c) ((d + e ) * f )
Como puede identificarse esta situación. Obsérvese que si existen dos nodos
cuya relación es padre-hijo y los dos contienen operadores, debemos abrir un
paréntesis si el operador hijo tiene menos prioridad que el operador padre. Este
paréntesis que se abre debe existir siempre y cuando el padre tenga más
jerarquía que el hijo y asea izquierdo o derecho. Para insertar un paréntesis son
necesarias tres condiciones:
4. que el nodo contenga un operador.
5. que su hijo (izquierdo o derecho) contenga también un operador.
6. que el nodo padre sea un operador de mayor jerarquía que el nodo hijo.
Si estas tres condiciones se cumplen debemos abrir un paréntesis. Este
paréntesis, guardaremos en algún lugar el paréntesis que cierra para que en su
momento, se incorpore al arreglo infijo. Para la solución a este problema debe
servirnos una pila ya que el proceso se asimila a escribir un árbol en inorden, con
la salvedad de que bajo las tres condiciones expuestas anteriormente, debemos
insertar un paréntesis a la pila.

APLICACIONES DE LOS GRAFOS


En este capitulo, vamos a estudiar algunos problemas que se resuelven usando
los grafos. El objetivo de este estudio es mostrar al lector diferentes técnicas para
resolver problemas prácticos usando esta estructura. El lector con base en estos
conocimientos estará en capacidad de imaginarse otras aplicaciones prácticas de
los grafos y los dígrafos. Hemos tratado de presentar las aplicaciones más
clásicas como son: Algoritmo de Prim. Algoritmo de Kruskal. Algoritmo de Dijkstra,
el problema de las parejas, la clasificación topológica, la ruta crítica, etc.
ALGORITMO DE PRIM
Este algoritmo resuelve el problema de escoger la mejor alternativa entre las
muchas que se pueden presentar. Veamos el siguiente grafo.
Este grafo esta compuesto por 13 vértices y puede representar una red de

1 7
4 5
3 2 5
8
7 5
7 1 4
6
4 6
9 10
7 4

computadores, un circuito, un sistema de carreteras, etc. Cada arco tiene un valor.


Este valor puede interpretarse como el costo para llegar de un vértice a otro, por
ejemplo el costo para llegar del vértice 4 al vértice 7 es 8 que es el mismo costo
para llegar del vértice 7 al vértice 4.
El problema que se resuelve a través del algoritmo de PRIM es escoger el
conjunto de arcos de maneta que conecten todos los vértices y además que la
suma de costos sea mínima.
Para el grafo anterior, los arcos que cumplen con estas dos propiedades se
pueden escoger de acuerdo al siguiente procedimiento:

1 2 3

4 5

6 7 8

9 10

11 12 13

El método es el siguiente: debemos determinar en que vértice empezamos el


proceso. Para el efecto comencemos en el vértice 2. Desde 2 extendemos todos
los arcos así:
1 8 2 6 3
1 7
4 5
6 7 8

9 10

11 12 13

Y marcamos el vértice 2. Luego escogemos el arco cuyo costo sea menor. Si


existen dos arcos con el mismo costo, podemos escoger cualquiera y el efecto
final es el mismo. Para este caso debemos escoge el arco que llega al vértice 4.
Marcamos el vértice 4 y extendemos los arcos desde el vértice 4, tendiendo
presente que hacia los vértices ya marcados no pueden extenderse nuevos arcos.
1 8 2 6 3
1
4 2 5
3 8
6 7 7 8
9 10

11 12 13

En el paso anterior se observa que si se extienden los arcos desde el vértice 4

quedarían 2 arcos incidentes en el vértice 5. El procedimiento considera esta

situación. Cuando dos arcos inciden en un mismo vértice no marcado, se deja el

arco de menor peso. Por esta razón el arco 4:5 de peso 2 prevalece sobre el arco

2:5 de peso 7. Ahora debemos escoger, de los no marcados, el vértice en el cual

incide el arco de menor peso, escogemos el vértice 5, lo marcamos y

extendemos desde 5 los arcos hacia los demás vértices así:

1 8 2 6 3

4 2 5

3 5 5

6 7 7 4 8

9 10
11 12 13

Ahora escogemos el vértice 6 y seguimos el procedimiento

1 2 6 3

2 4 2 5

3 5 5

6 7 4 8

1 9 10

11 12 13

Ahora podemos escoge el vértice 11 y seguir el procedimiento descrito. Al final del

proceso, es decir cuando hayamos repetido el procedimiento anterior N-1 veces,

siendo N el número de vértices, tenemos resuelto el problema Veamos:

1 2 3

2 4 2 5 5

3 7

6 1 8

1 9 3 10 1

11 2 12 3 13

El orden en el cual se escogieron los vértices para llegar a este resultado es:

2,4,5,6,11,1,12,13,8,9,7,10,3
La suma es 28 y esta cifra es la mínima que se puede conseguir. Si el sistema

inicial es un grafo que representa un sistema vial, podemos decir que 28 es el

mínimo kilometraje que se puede obtener para unir todas las ciudades. Se invita

al lector a desarrollar el mismo ejercicio comenzando desde el vértice 12. Veamos

el resultado final:

1 2 3

2 4 2 5 5

6 7 8

4 1
1 3 1

9 10

11 2 12 2 13

El orden de recorrido para llegar a este resultado fue el siguiente:

12,11,6,1,4,2,5,13,8,9,7,10,3

Obsérvese que la suma28 se mantiene y la estructura del árbol expandido resulto

igual, aunque hubiera podido resultar diferente.

Para el desarrollo del algoritmo se utilizan las siguientes variables:

6. una matriz de adyacencia

7. un arreglo donde se almacenan los costos mínimos

8. un arreglo de padres.

9. un arreglo de vértices marcados.

10. la variable suma.


La matriz de adyacencia, almacena en cada entrada M(i)(j), en costo para llegar

del vértice i al vértice j. El arreglo mínimo ( ), almacena el costo mínimo de todos

los arcos que van quedando a través del proceso.

El arreglo padre ( ), almacena los padres de los vértices que se van escogiendo en la

medida ñeque avanza el proceso. El arreglo marcas ( ) mantiene el estado de marcado (1) o

no marcado (0) para cada vértice. La variable suma, almacena la suma de los arcos que

finalmente fueron para cumplir el objetivo del trabajo. Veamos la matriz de adyacencia

para el grafo anterior.

1 2 3 4 5 6 7 8 9 10 11 12 13
1 * 8 * * * 2 * * * * * * *
2 8 * 6 1 7 * * * * * * * *
3 * 6 * * * * * 5 * * * * *
4 * 1 * * 2 3 8 * 7 * * * *
5 * 7 * 2 * * 5 5 * 4 * * *
6 2 * * 3 * * * * 4 * 1 * *
7 * * * 8 5 * * * 1 6 * * *
8 * * 5 * 5 * * * * 6 * * 1
9 * * * 7 * 4 1 * * 3 * 7 *
10 * * * * 4 * 6 6 3 * * 4 *
11 * * * * * 1 * * * * * 2 *
12 * * * * * * * * 7 4 2 * 3
13 * * * * * * * 1 * * * 3 *
Donde exista un carácter *, significa que

entre estos dos vértices no existe arco y

estará almacenado el numero 32767, es

decir el mayor valor entero. Para cumplir

el trabajo, el algoritmo debe estructurarse

como un ciclo desde 2 hasta N, donde es

el número de vértices.

12. Barranquilla

13. Medellín
14. Cúcuta

15. Bucaramanga

16. Tunja

17. bogota

18. Cali

19. Popayán

20. pasto

21. Neiva

22. Leticia

1 2 3 4 5 6 7 8 9 10 11
1 84 85 141 175
2 84 32 25 35
3 85
4 32
5 12 36 122
6 141 25 12 47 110
7 35
8 47 28
9 175 28
10 36
11 122 110
7. Siguiendo el método descrito, calcule el mínimo número de kilómetros de

carretera que se debe construir para unir todas las ciudades de Colombia

incluidas en este sistema vial. (Cada cifra multiplicada por 10 da el numero

de kilómetros real entre ciudad)

8. elabore el trabajo del ejercicio 1 utilizando el algoritmo PRIM ( ).

9. la función PRIM ( ). Calcula la suma mínima del conjunto de los arcos que

se deben incluir para cubrir todos los vértices del grafo, de manera que el

nuevo grafo sea fuertemente conectado. El objetivo de este ejercicio

consiste en elaborar un nuevo algoritmo PRIM1( ) que calcule la suma

máxima del conjunto de arcos que se deben incluir para cubrir todos los
vértices del grafo de manera que l grafo resultante sea fuertemente

conectado

10. para el siguiente grafo, calcule los valores finales de los arreglos:

Mínimo ( )

Padres ( )

Marcas ( )

Determine el valor suma y dibuje el árbol expandido resultante.

Lleve a cabo el proceso, primero manualmente y luego utilizando el algoritmo


PRIM ( )
11. modifique el algoritmo PRIM ( ) de manera que reciba por valor el vértice
desde el cual se desea empezar el proceso y que realice su tarea desde el
vértice deseado.
12. dibuje el árbol expandido que resulta al procesar el grafo del ejemplo
desarrollado en el numeral 11.1 desde el vértice 7 determine el contenido
final de los arreglo:
Mínimo ( )
Padres ( )
Marcas ( )
ALGORITMO DIJKSTRA
El objetivo de este algoritmo, consiste en calcular la distancia mínima entre un
vértice y todos los demás. Por ejemplo, podemos utilizar un algoritmo para
determinar que la mínima distancia de la ciudad de Bogota a las demás
ciudades colombianas, están dadas por el siguiente árbol expandido (ver
ejercicio 1, numeral 11.2)
Para efecto de ilustrar el procedimiento, tomaremos el siguiente grafo:

Donde la matriz de adyacencia almacena la siguiente información:


1 2 3 4 5 6 7 8 9 10 11
1 * * * * * * * * * * *
2 2 * 4 3 5 6 * * * * *
3 4 4 * * * 5 4 1 * * *
4 * 3 * * 3 * * * 2 * *
5 * 5 * 3 * 1 * * 6 * *
6 * 6 5 * 1 * 4 * 2 3 *
7 * * 4 * * 4 * 4 * 1 *
8 * * 1 * 1 * 4 * * 5 *
9 * * * 2 6 2 * * * 2 1
10 * * * * * 3 1 5 2 * 6
11 * * * * * * * * 1 6 *
Obsérvese que también para este procedimiento, los vértices que no están unidos
por el mismo arco, almacén un mayor valor en la entrada correspondiente en la
matriz. Por ejemplo del vértice 11 al vértice 8. Al no existir arco entre estos dos
vértices, se almacena en la entrada M(11)(8) un mayor valor. Para el desarrollo de
este algoritmo, debemos observar que el mayor no puede ser 32767, si estamos
trabajando en maquinas donde cada entero tiene 16 bits. El mayor valor debe ser
una cifra tal que la suma de la cifra escogida mas el costo de un arco no exceda
el dato 32767. Si no se tiene en cuenta esta restricción, los datos serán
incorrectos. Para la prueba a la rutina utilizando el grafo anterior, se trabajo como
mayor valor el dato 32000.
El procedimiento es parecido al algoritmo PRIM ( ) la diferencia consiste en que
se escoge el vértice donde la suma de todos los arcos para llegar del vértice
origen hasta dicho vértice sea mínima. Veamos.
1
2 3
4 5 6 7 8
9 10
11
Si comenzamos por el vértice 1, debemos primero extender los arcos desde el
vértice 1 y marcar el vertice1, así:
Aquí se escoge el vértice donde el número entre paréntesis sea menor. Este
número es la suma desde el vértice origen hasta dicho vértice. Para el caso el
vértice escogido es el 2. Luego debemos extender los arcos desde el vértice 2 de
la siguiente manera:

1(0)
2 4
2(2) 3(4)
3 5 6
4(5) 5(7) 6(8) 7 8
9 10
11
Obsérvese que el arco 2:3 no se extendió ya que la suma 3(4) es menor o igual
que la suma 2(6);4<=6. Únicamente se extiende el arco si esta relación es mayor.
Ahora escogemos el vértice 3 y extendemos los arcos desde dicho vértice,
quedando el árbol expandido así:
1(0)
2 4
2(2) 3(4)
3 5 6 4 1
4(5) 5(7) 6(8) 7(8) 8(5)

No se debe olvidar que hacia los vértices que ya están marcados no se pueden
extender arcos. Siguiendo el procedimiento descrito y escogiendo los vértices en
el siguiente orden:
4,8,5,9,6,7,11,10
El árbol expandido final es:
1(0)
2 4
2(2) 3(4)
3 5 6 4 1
4(5)
5(7) 6(8) 7(8) 8(5)
2
9(7) 2 10(9)
1
11(8)
Se puede asegurar que la distancia mínima entre el vértice 1 y todos los demás
es la indicada en la cifra entre paréntesis. Se recomienda al lector, utilizar este
procedimiento para averiguar la distancia mínima entre Bogota y las ciudades de
Colombia. El algoritmo DIJKSTRA ( ), fundamentalmente es el mismo que el
algoritmo PRIM ( ), con una única diferencia. El vértice escogido, es el que tenga
la mínima distancia acumulada desde el origen hasta dicho vértice. Para el
desarrollo del algoritmo, utilizaremos las siguientes variables:
5. la matriz de adyacencia
6. un arreglo de distancia mínimas
7. un arreglo de padres
8. un arreglo de vértices marcados
El arreglo mínimo ( ), se inicializa con la fila 1 de la matriz de adyacencia.
ORDEN TOPOLÓGICO EN UN DÍGRAFO
El orden topológico en un dígrafo, lo podemos ilustrar a través de un ejemplo.
Supongamos que el decano de la carrera de la ingeniería de sistemas solicita un
orden específico para que un estudiante pueda desarrollar su carrera. La única
información que tenemos para resolver el problema es el siguiente programa de
estudios
CODIGO NOMBRE PRE REQUISITO
14. Matemáticas I
15. Ingles I
16. El robot de Karen
17. Computadores
18. Matemáticas II 1
19. Ingles II 2
20. Turbo Pascal 3,4
21. Matemáticas III 5
22. Ingles III 6
23. Estructuras de datos I 1 ,7
24. Lenguaje C 9, 10
25. Assembler 9
26. Estructura de Datos II 8,10
Para efectos prácticos, solamente dejamos el programa de estudios hasta este
nivel. El problema lo podemos resolver fácilmente utilizando un dígrafo. El
programa anterior, lo podemos resolver fácilmente en un dígrafo, utilizando
solamente los códigos de las materias así
2 9

6 1
2
1
3 0

7 1
1

1
5 3

1 8
El dígrafo anterior representa el programa académico. Por ejemplo la materia
Estructura de Datos II, no puede verse sin haber aprobado las materias Estructura
de Datos I y Matemáticas III. Existe un método denominado orden topológico, el
cual nos da el orden en el cual se debe desarrollar este programa académico para
ver las materias cumpliendo con los pre requisitos exigidos para cada asignatura.
Tomemos el dígrafo anterior y almacenémoslo en dos listas de adyacencia.

1 5, 10 1
2 6 2
3 7 3
4 7 4
5 8 5
6 9 6
7 10 7
8 13 8
9 11, 12 9
10 11, 13 10
11 11
LEY DE 12 ADYACENCIA LISTA
12
DE ADYACENCIA 13 INVERTIDA
13

El método consiste en contar los grafos de entrada para cada vértice y


almacenarlos en un arreglo. Para contar cuantos grafos de entrada tiene cada
vértice, debemos utilizar la lista

S-ar putea să vă placă și