Hola Mundo 08

download Hola Mundo 08

of 15

Transcript of Hola Mundo 08

  • 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.jpg
  • 7/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.jpg
  • 7/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.jpg
  • 7/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.jpg
  • 7/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.jpg
  • 7/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.jpg
  • 7/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.jpg
  • 7/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.jpg
  • 7/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