Post on 21-Feb-2018
7/24/2019 Hola Mundo 08
1/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html
.java.c.pas
4 D E M A R Z O D E 2 0 0 8
Captulo 8
.
Arboles y Recursividad
Decimos que una definicin es recursiva cuando "define en funcin de si misma". Un algoritmo
es recursivo cuando para resolver el problema se invoca a si mismouna y otra vez hasta
resolverlo.
Para comprender esto lo mejor ser analizar algunos casos tpicos como la funcin matemticafactorial.
Definimos la funcin factorialde la siguiente manera: Sea xperteneciente al conjunto de los
nmeros naturales (incluyendo al cero) entonces:
factorial(x) = x*factorial(x1)
factorial(0) = 1
La definicin recurre a si misma para expresar lo que define. Es una definicin recurrenteo
recursiva.
Desde el punto de vista de la programacin, programar esta funcin recursiva no implica ni
ms ni menos que seguir al pie de la letra su definicin matemtica.
Como vemos, la funcin recibe un parmetro x. Si xes igual a 0entonces retorna 1. Si xes
mayor que cero entonces retorna el producto de xpor "lo que retorna la misma funcin"
invocndola con el parmetro (x1).
A continuacin vemos un programa principal que lee un valor ny muestra el factorial de n
utilizando la funcin recursiva.
Publicaciones del Autor
>> Click para Ms Informacin
7/24/2019 Hola Mundo 08
2/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 2
En Pascal, lo anterior se codifica de la siguiente manera:
testFactorial.pas
1:
2: // funcion factorial recursiva
3:function factorial(x:integer):longint;
4:begin
5: if( x=0)thenbegin 6: factorial:=1;
7: endelsebegin
8: factorial:=x*factorial(x1);
9: end;
10: end;
11:
12: // programa principal
13: var n:integer;
14:begin
15: write('Ingrese un valor: ');
16: read(n);
17: write('El factorial de ',n,' es: ');
18: writeln( factorial(n));
19: end.
20:
Notemos que la funcin factorial puede resolverse tambin sin necesidad de utilizar
recursividad. De hecho, ese fue uno de los primeros ejemplos que analizamos en este este
trabajo.
Acerca del Autor
Ing. Pablo A. Sznajdleder
Agradecimientos
No al blog de Java
Super Baterista
Sitios Relacionados
PascAlgo (por Lic. Hugo Cuello)Algoritmia.net
Java Algorithm Framework
http://www.jaframework.com/http://www.algoritmia.net/http://pascalgo.blogspot.com/https://www.youtube.com/watch?v=UNSzfuZgNHAhttp://holamundopascal.blogspot.com/2009/04/agradecimientos.htmlhttp://www.pablosz.com/cvhttp://bp0.blogger.com/_X1IHMrfIpE8/R81UqfLIxNI/AAAAAAAABsI/BP8hxSM7Ag0/s1600-h/factorialNoRec.jpghttp://bp1.blogger.com/_X1IHMrfIpE8/R81IivLIxJI/AAAAAAAABro/lq-5Zs60myY/s1600-h/factorialMain.jpg7/24/2019 Hola Mundo 08
3/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 3
Si bien el algoritmo es bastante simple, esta versin resulta ms compleja que la versin
recursiva.
Pila de Llamadas
Para comprender bien el funcionamiento de los procedimientos y las funciones recursivas es
fundamental notar que cada llamada (o invocacin) a un procedimiento o funcin queda
apilada en una "pila de llamadas" de forma tal que cada procedimiento o funcin que se
encuentre apilado no podr f inalizar su ejecucin si antes no finalizaron los procedimientos
y/o funciones que fueron llamados (apilados) con posterioridad.
Para hacerlo ms simple, si en la funcin finvocamos a la funcin gy en la funcin g
invocamos a la funcin hentonces la primer funcin en finalizar su ejecucin ser h, luego gy
por ltimo f. Y cuando finalice h, la funcin gcontinuar su ejecucin exactamente en la
lnea siguiente a la llamada a la funcin h. Y cuando finalice g, fcontinuar su ejecucin en la
lnea siguiente a la llamada a g.
Cuando tenemos el caso de una funcin recursiva, cada invocacin recursiva (a si misma) ser
apilada en la pila de llamadas, as que la invocacin a la funcin no terminar hasta que no
terminen las invocacines que fueron apiladas posteriormente.
Esto lo podemos probar con el siguiente ejemplo:
testRecursivo.pas
1:
2: // procedimiento recursivo
3:procedure miProcRecursivo(n:integer);
4:begin
5: writeln('comienza (n=',n,')');
6: if( n
7/24/2019 Hola Mundo 08
4/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 4
3, luego el 2, luego el 1. "El ltimo que se llam fue el primero que finaliz".
Es muy importante notar que la funcin recursiva debe tener una condicin de corte. En este
ejemplo la condicin de corte
es if( n < 4 ).Si no estuviese esta condicin entonces el procedimiento se llamara a si mismo
permanentemente trayendo aparejadas dos consecuencias: primero el programa se colgara ya
que nunca retornar el control al programa principal y, segundo, dado que la pila de llamadas
se implementa en memoria, en algn momento la memoria libre se acabar y tendremos un
error llamado "stack overf low" que har finalizar abruptamente la ejecucin del programa.
Vamos a probarlo:
testRecursivo2.pas
1:
2: // procedimiento recursivo
3:procedure miProcRecursivo(n:integer);
4:begin
5: writeln('comienza (n=',n,')');
6:
7: // invocamos recursivo siempre, sin condicion
8: miProcRecursivo(n+1);
9:
10: // nunca se llega a este punto
11: writeln('finaliza (n=',n,')');
12: end;
13:
14: // programa principal
15:begin
16: miProcRecursivo(1);
17: end.
18:
El resultado es:
El programa corta abruptamente tirando un "Runtime error 202". El cdigo de error 202
indica que ocurri un "Stack Overflow" (desbordamiento de la pila). Y, de hecho, lo que
muestra en la consola (pantalla) es el "Stack Trace": estado de la pila de llamadas al momento
de ocurrir el error.
Volviendo a la funcin recursiva factorialahora podemos notar que la condicin de corte es if(
x=0 ).
Problema 8.1
Se tiene el archivo EMPLEADOS.datcon la informacin de cada empleado de la compaia.
EMPLEADOS.dat
http://community.freepascal.org:10000/docs-html/user/userch14.htmlhttp://bp1.blogger.com/_X1IHMrfIpE8/R-mBMVKJM2I/AAAAAAAABwY/Z2TjfhTpucs/s1600-h/testRecursivo2.jpg7/24/2019 Hola Mundo 08
5/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 5
id (integer)
nombre (string[40])
idJefe (integer, hace referencia al iddel jefe del empleado)
El archivo est ordenado por idde forma tal que cada id coincide con el nmero de registro
del archivo (menos 1, ya que los registros se numeran desde cero).
El "gerente general" de la compaia, tambin figura como empleado y su idJefeser 1.
Se pide desarrollar un programa interactivo que permita ingresar el idde un empleado y luego
imprima toda la lnea jerrquica a la cual responde el empleado cuyo id se ingres.
Anlisis
El problema se resuelve muy fac ilmente utilizando un procedimiento recursivo que llamaremos
imprimirJefe.
Comencemos por definir la seccin type para luego analizar el programa principal en el que
haremos la invocacin al procedimiento recursivo.
1:
2:type
3: REmpleado =record
4: id:integer;
5: nombre:string[40];
6: idJefe:integer;
7: end;
8: 9: FEmpleados =fileof REmpleado;
10:
Ahora veamos el programa principal.
El programa principal es verdaderamente simple. Leemos el iddel empleado a consultar y
accedemos al archivo para averiguar su nombre y su jefe directo (idJefe). Imprimimos los
ttulos e invocamos al procedimiento imprimirJefepara que haga el resto del trabajo.
Para acceder al archivo desarrollamos el procedimiento leerque recibe el idde un empleado y
realiza el acceso directo y la lectura sobre el archivo. La informacin leida queda almacenada
http://bp2.blogger.com/_X1IHMrfIpE8/R82raBWrQbI/AAAAAAAABsg/YMZJZg_X8SE/s1600-h/mainEmp.jpg7/24/2019 Hola Mundo 08
6/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 6
en el parmetro (por referencia) reg.
Notemos que a imprimirJefelo estamos invocando con el parmetro reg.idJefepor lo tanto
el procedimiento debe mostrar el nombre de este empleado (el jefe del empleado que origin
la consulta) e invocarse a si mismo con el idde su jefe ("el jefe del jefe"). As hasta que el
empleado no tenga jefe.
El procedimiento imprimirJefe recibe el idde un empleado, accede al archivo para recuperar
su nombre (reg.nombre) y el id de su jefe (reg.idJefe). Muestra el nombre del empleado
recibido y (si tiene jefe) se l lama a si mismo pasndo como parmetro el id del jefe.
imprimirJefe es un procedimiento recursivo ya que resuelve su tarea invocndose a si
mismo.
Problema 8.2
Se tiene el archivo FAMILIAS.datcon la informacin de un conjunto de familias, con el
siguiente formato.
FAMILIAS.dat
nombre string[30]
cantHijos integer
El archivo est ordenado de forma tal que "para cada persona, sus hijos se encuentran a
continuacin". Veamos un ejemplo:
http://bp0.blogger.com/_X1IHMrfIpE8/R82uahWrQcI/AAAAAAAABso/eJLfVmXiWwg/s1600-h/impJefe.jpg7/24/2019 Hola Mundo 08
7/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 7
En el ejemplo vemos reflejados los datos de 3familias:
La familia de "Juan" tiene dos hijos: "Maria" (no tiene hijos) y "Carlos", que tiene un hijo:
"Ezequiel" quien tiene dos hijos: "Martn" y "Romina" ambos sin hijos.
La famil ia de "Alberto" (quien no tiene familia ya que no tiene hijos).
La famil ia de "Marcelo" quien tiene un hijo: "Gerardo" quien tiene dos hijos: "Si lvana" y "Karina"
ambas sin hijos.
Se pide hacer un programa que imprima un listado de todas las familias registradas en el
archivo indicando el nombre del pariente ms viejo (en el ejemplo seran "Juan", "Alberto" y
"Marcelo") y la cantidad de integrantes que tiene cada familia ( sumatoria de hijos, nietos, etc)
Anlisis
Para resolver este problema vamos a pensar en una funcin que llamaremos leerFamilia. Esta
funcin retornar true o false segn haya podido procesar correctamente los datos de una
familia del archivo. Si retorna true, en los parmetros de salida retornar el nombre y la
cantidad de integrantes de la familia que proces.
Con esta funcin (que luego analizaremos en detalle) el programa principal queda resuelto de
la siguiente manera.
http://bp2.blogger.com/_X1IHMrfIpE8/R82x6BWrQdI/AAAAAAAABsw/6-Jw-03f3Dg/s1600-h/tablaHijos.jpg7/24/2019 Hola Mundo 08
8/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 8
En el programa principal abrimos el archivo y simplemente iteramos mientras la funcin tenga
datos para procesar. Es decir: iteramos mientras la funcin retorne true. La misma funcin se
encarga de asignar el nombre y la cantidad de miembros en las var iables nomFlia y
totMiembros por lo que en el programa principal simplemente mostramos sus contenidos para
generar el listado que se pide en el enunciado.
http://bp3.blogger.com/_X1IHMrfIpE8/R8_9DxWrQjI/AAAAAAAABtg/tL06WCP6Ne0/s1600-h/leerFlias02.jpghttp://bp3.blogger.com/_X1IHMrfIpE8/R8_9DxWrQjI/AAAAAAAABtg/tL06WCP6Ne0/s1600-h/leerFlias02.jpghttp://bp0.blogger.com/_X1IHMrfIpE8/R8_9DBWrQiI/AAAAAAAABtY/qw75Cs0avxM/s1600-h/leerFlias01.jpghttp://bp0.blogger.com/_X1IHMrfIpE8/R86MsRWrQeI/AAAAAAAABs4/pdffzs1sfpo/s1600-h/mainFlias.jpg7/24/2019 Hola Mundo 08
9/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 9
La funcin se ocupa de recorrer el archivo por lo tanto debe controlar que no llegue el eof.
Retorna true o false si ley un registro y (en ese caso) asign valores a los parmetros suma y
nomFlia. Recordemos que al leer el ltimo registro de un archivo la funcin eofretorna true
por este motivo el if( eof(arch) ) lo hacemos al comienzo de la funcin y si retorna true
entonces f inalizamos la funcin retornando false(no hay ms registros por leer).
Basicamente la funcin lee un registro (una persona), obtiene la cantidad de hijos de esta
persona y luego entra en un fordonde se llama a si mismatantas veces como hijos tiene la
persona que ley.
Dentro del for se incrementa la variable suma(parmetro que recibe por referencia) por lo
tanto, si la persona leida tiene tres hijos, el foriterar tres veces y la suma se incrementar
en 3, pero a su vez, dentro del forse invoca a la funcin pasndole la misma variable suma
por lo que si uno de los hijos de la persona leida tiene 5 hijos ms, la llamada recursiva
incrementar la (misma) variable suma otras cinco veces, y as.
Notemos tambin que antes de ingresar al forpreguntamos si sumaes cero. En este caso
estaremos ante la presencia de un "jefe de familia", entonces asignamos su nombre al
parmetro nomFlia. Justamente la variable suma(que en el programa principal estotMiembros) se inicializa en cero antes de invocar a la funcin.
familias.pas
1:
2: //
3: // seccion type
4: //
5: type
6: RFamilia =record
7: nombre:string[30];
8: cantHijos:integer;
9: end;
10:
11: FFamilias =fileof RFamilia;
12: 13:
14: //
15: // funcion leerFamilia
16: //
17: function leerFamilia(var arch: FFamilias
18: ;var nomFlia:string[30]
19: ;var suma:integer):boolean;
20: var
21: reg: RFamilia;
22: nomFliaAux:string[30];
23: i:integer;
24:
25:begin
26: // si no hay mas datos en el archivo retorna false
27: if( eof(arch))thenbegin
28: leerFamilia:=false;
http://bp3.blogger.com/_X1IHMrfIpE8/R8_9DxWrQjI/AAAAAAAABtg/tL06WCP6Ne0/s1600-h/leerFlias02.jpg7/24/2019 Hola Mundo 08
10/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 10
29: exit;// la funcion finaliza aqui...
30: end;
31:
32: // leo un registro
33: read(arch,reg);
34:
35: // si suma es cero entonces es un "jefe" de flia
36: if( suma=0)thenbegin
37: nomFlia:=reg.nombre;
38: end;
39:
40: // itero tantas veces como hijos tiene la persona
41: for i:=1to reg.cantHijos dobegin
42: 43: suma:=suma+1;// incremento una vez por hijo
44:
45: // invoco recursivamente a la funcion para
46: // procesar los hijos de los hijos
47: leerFamilia(arch,nomFlia,suma);
48:
49: end;
50:
51: // la funcion returna true porque pudimos asignar
52: // datos a los parametros nomFlia y suma
53: leerFamilia:=true;
54: end;
55:
56:
57: //
58: // programa principal
59: //60:
61: var
62: arch: FFamilias; reg: RFamilia;
63: nomFlia:string[30];
64: totMiembros:integer;
65:begin
66: // abro el archivo
67: assign(arch,'FAMILIAS.dat');
68: reset(arch);
69:
70: // inicializo la variable en la cual la funcion
71: // sumara los miembros de cada familia
72: totMiembros:=0;
73:
74: // cada iteracion corresponde a una nueva familia
75: while( leerFamilia(arch,nomFlia,totMiembros))
76: dobegin 77: // imprimo una linea del listado
78: writeln( nomFlia,' ',totMiembros );
79:
80: // reseteo la variable
81: totMiembros:=0;
82: end;
83:
84: // cierro el archivo
85: close(arch);
86: end.
87:
Arboles
Los rboles son estructuras de datos recursivas. Esto es: nodos que tienen 2 o ms punteros a
nodos de su mismo tipo. Al representarlos graficamente vemos que tienen forma de rbol.
7/24/2019 Hola Mundo 08
11/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 1
El rbol tiene una raz la cual tiene dos o ms ramas. Cada rama es en s misma una raz con
ms ramas y as, por lo tanto para recorrer un rbol necesitaremos un algoritmo recursivo.
Segn la cantidad de hijos que tengan sus nodos, los rboles se clasifican en rboles binarios
(2 hijos), rboles ternarios(3 hijos) o rboles narios(nhijos, con nvariable).
El diagrama anterior representa un rbol binario.
En este captulo trabajaremos con rboles binarios. Luego, en los ejercicios explicaremos
otros casos a medida que se vayan planteando.
Definicin del Nodo del Arbol Binario
1:
2:type
3: PNArbol =^NArbol;
4: NArbol =record
5: info:integer;
6: izq: PNArbol;// puntero al hijo izquierdo
7: der: PNArbol;// puntero al hijo derecho
8: end;
9:
Ahora consideraremos un conjunto de valores numricos, sin ningn orden como podra ser el
conjunto Aque veremos a continuacin:
A= { 5, 2, 8, 9, 1, 4, 6, 3, 7}
Con los valores de este conjunto analizaremos las diferentes operaciones que podemos aplicar
a los rboles.
Agregar Nodos a un Arbol Binario
Pensemos en un programa que cargue los datos del conjunto en un rbol binario con el
siguiente criterio: "los valores menores van a la izquierda, los valores mayores van a la
derecha".
Respetando este criterio, si se agregan los valores del conjunto Aen en su orden original, el
rbol que los contenga se ver de la siguiente manera:
http://bp1.blogger.com/_X1IHMrfIpE8/R86k-hWrQgI/AAAAAAAABtI/4mT2Y4A0bHI/s1600-h/arbol.jpg7/24/2019 Hola Mundo 08
12/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 12
El primer valor es el 5, por lo tanto ser la raz del rbol. Luego ingresa un 2. Como es menor
que 5 lo ubicamos en el nodo izquierdo. Luego ingresa 8, que es mayor que 5 as que lo
ubicamos en su nodo derecho. A continuacin ingresa 9, es mayor que 5, pasamos a su nodo
derecho que tiene 8, como 9 es mayor que 8 lo ubicamos en su nodo derecho. Luego llega el 1
que es menor que 5. Vemos su nodo izquierdo y encontramos al 2. Como 1 es menor que 2 lo
ubicamos en su nodo izquierdo, y as hasta cargar todos los datos del conjunto.
1:
2: // programa principal
3: var raiz: PNArbol;
4:begin
5: agregarValor(raiz,5);
6: agregarValor(raiz,2);
7: agregarValor(raiz,8);
8: agregarValor(raiz,9);
9: agregarValor(raiz,1);
10: agregarValor(raiz,4); 11: agregarValor(raiz,6);
12: agregarValor(raiz,3);
13: agregarValor(raiz,7);
14: // :
15: end.
16:
Veamos ahora el procedimiento agregarValor que se ocupa de agregar nodos al rbol
respetando el criterio indicado.
1:
2:procedure agregarValor(var raiz: PNArbol; v:integer);
3:begin
4: // si la raiz es nula entonces le asigno memoria
5: // guardo la informacion (v) y finalizo el proc. 6: if( raiz =NIL)thenbegin
7: new(raiz);
8: raiz .info:=v;
9: raiz .der:=NIL;
10: raiz .izq:=NIL;
11: exit;
12: end;
13:
14: // si estoy aca es porque la raiz no es NIL
15: // entonces si el valor v que vamos a agregar es
16: // menor que el valor de la raiz vuelvo a invocar
17: // al procedimiento considerando como raiz
18: // al hijo izquierdo. Si es mayor o igual lo
19: // invoco considerando al hijo derecho
20: if( v
7/24/2019 Hola Mundo 08
13/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 13
22: endelsebegin
23: agregarValor(raiz^.der, v );
24: end;
25: end;
26:
Al cargar el rbol siguiendo este criterio decimos que el rbol es un arbol binario de
bsqueda. Es decir que podemos utilizar un rbol binario para realizar bsquedas con la
misma eficiencia que una bsqueda binaria y tambin podemos utilizarlo para ordenar
conjuntos.
Veremos que segn el recorrido que realicemos sobre sus nodos, los valores (en este caso
numricos) resultarn ordenados ascendentemente.
Recorrer los nodos del Arbol
Recorrido de Orden Inverso(o inOrden): Este recorrido consiste en "bajar" por la rama
izquierda hasta el ltimo nodo, listar su valor, subir un nivel, listar el valor del padre y
considerar al hijo derecho como nueva raiz para repetir la operacin.
En nuestro ejemplo: "bajamos" por la rama izquierda hasta llegar al ltimo nodo, que contiene
el valor 1. Listamos su valor (1) y luego "subimos" un nivel para listar el valor del padre (2).
Ahora repetimos la operacin con el hijo derecho: "bajamos" hasta el ltimo nodo. Li stamos su
valor (3). Subimos un nivel y listamos el padre (4). Repetimos la operacin con su hijo
derecho (que en este caso no tiene) entonces subimos otro nivel (que ya fue procesado, el 2),subimos otro nivel y listamos el (5) para luego bajar a su hijo derecho y repetir toda la
operacin bajando hasta el ltimo nodo por la izquierda (6) y as sucesivamente hasta
terminar.
Si analizamos la salida de este recorrido (los nneros en rojo) veremos que fueron saliendo en
orden.
Por lo tanto, si tenemos un rbol binario de bsqueda al recorrerlo con "orden inverso" lo
veremos ordenado.
El cdigo para un recorrido de orden inverso es el siguiente:
1:
2:procedure inOrden(raiz: PNArbol);
3:begin 4: if( raizNIL)thenbegin
5: inOrden(raiz^.izq);
6: writeln( raiz .info);
7: inOrden(raiz^.der);
8: end;
9: end;
10:
Basicamente lo que hace este procedimiento es llamarse a si mismo con el hijo izquierdo y
terminar si es NIL.
Hagamos un seguimiento con los datos del ejemplo que estamos analizando.
Invocamos al procedimiento pasndole un puntero a la raz del rbol: 5. Como es distinto deNIL se llama a si mismo con su hijo izquierdo: 2, que como es distinto de NIL se llama a si
mismo con su hijo izquierdo: 1, que como es distinto de NIL se llama a si mismo con su hijo
izquierdo: NIL. Esta tima llamada finaliza sin hacer nada ya que no ingresa al if. As que
regresamos a la llamada anterior (la del 1). Imprime su valor (1) y se llama a si mismo con su
hijo derecho quien es NIL por lo tanto finaliza. En este momento finaliza la invocacin al
procedimiento con el valor 1, as que regresamos a la llamada anterior: imprime el (2) y se
llama a si misma con su hijo derecho: 4 que como es distinto de NIL se llama a si misma con su
hijo izquierdo: 3, y as sucesivamente.
Recorrido de PreOrden: Este recorrido considera primero la raz, luego el arbol izquierdo y
por ltimo el arbol derecho.
En preOrden, los nodos de nuestro rbol se listaran de la siguiente manera:
7/24/2019 Hola Mundo 08
14/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
http://holamundopascal.blogspot.mx/2008/03/capitulo-8.html 14
5, 2, 1, 4, 3, 8, 6, 7, 9
El algoritmos para recorrerlo en este orden es el siguiente:
1:
2:procedure preOrden(raiz: PNArbol);
3:begin
4: if( raizNIL)thenbegin
5: writeln( raiz .info);
6: preOrden(raiz^.izq);
7: preOrden(raiz^.der);
8: end; 9: end;
10:
Primero imprimimos, luego invocamos con el hijo izquierdo y luego con el hijo derecho.
Recorrido de Orden Posterior (o postOrden): este recorrido implica recorrer primero la rama
izquierda, luego la derecha y por ltimo procesar la raz.
En nuestro ejemplo, el recorrido postOrden arrojar el siguiente resultado:
1, 3, 4, 2, 7, 6, 9, 8, 5
y el algoritmos para procesarlo es el siguiente:
1:
2:procedure postOrden(raiz: PNArbol);
3:begin
4: if( raizNIL)thenbegin
5: postOrden(raiz^.izq);
6: postOrden(raiz^.der);
7: writeln( raiz .info);
8: end;
9: end;
10:
Algoritmos y Estructuras de DatosUBA UTN FRBA
7/24/2019 Hola Mundo 08
15/15
15/10/2015 HolaMundo.pascal (online): Captulo 8
Entrada ms reciente Entrada antigua
.
Publicado por PabloSZ
Pgina principal
Todos los Derechos Reservados Propiedad Intelectual Nro. 591212
http://holamundopascal.blogspot.mx/http://holamundopascal.blogspot.mx/2008/02/programa-pasajeros-frecuentes.htmlhttp://holamundopascal.blogspot.mx/2008/05/empresa-piramidal.html