mapprepost.cpp

// $Id$

#include <iostream>
#include "./util.h"
#include "./tree.h"
#include "./btree.h"
#include "./util_tree.h"
#include "./util_btree.h"

using namespace aed;
using namespace std;

/* COMIENZO DE DESCRIPCION 
   
   __USE_WIKI__
   Escribir una funci\'on 
   #void map_pre_post(tree<int> &T,list<int> &L, int (*fpre)(int),int (*fpost)(int))#
   que lista los valores nodales del \'arbol ordenado orientado
   #T# en una mezcla de orden previo y posterior, donde en orden 
   previo se listan los valores nodales aplicandoles #fpre()# y en 
   orden posterior los #fpost()#.   
   Por ejemplo, si #T=(1 3 (5 6 7 8))#, #f(x)=x# y #g(x)=x+1000#,
   entonces #map_pre_post(T,L,f,g)# debe dar 
   #L=(1,3,1003,5,6,1006,7,1007,8,1008,1005,1001)#. 
   [Tomado en el recup 30/6/2005]. 
   keywords: arbol orientado, lista

   FIN DE DESCRIPCION 

   La definicion recursiva es

   map_pre_post(n,f,g) = 
      si n=Lambda: lista vac\'\i{}a
      si n no es Lambda:  f(n),\mapprepost(n_1,f,g),
                                     ...,map_pre_post(n_m,f,g),g(n)  */

// Estas son las funciones de mapeo usadas en el
// enunciado
int f(int x) { return x; }
int g(int x) { return x+1000; }

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void map_pre_post(tree<int> &T,tree<int>::iterator n,
		  list<int> &L, 
		  int (*fpre)(int),int (*fpost)(int)) {
  // Insertar primero el valor de `fpre()' aplicado al
  // valor nodal. 
  L.insert(L.end(),fpre(*n));
  // Insertar las secuencias generadas por los hijos
  tree<int>::iterator m = n.lchild();
  while (m!=T.end()) 
    map_pre_post(T,m++,L,fpre,fpost);
  // Insertar primero el valor de `fpost()' aplicado al
  // valor nodal. 
  L.insert(L.end(),fpost(*n));
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Wrapper
void map_pre_post(tree<int> &T,list<int> &L, 
		  int (*fpre)(int),int (*fpost)(int)) {
  L.clear();
  if (T.begin()!=T.end())
    map_pre_post(T,T.begin(),L,fpre,fpost);
}

// -------------------------------------------------------------------
int main () {

  // Crea el arbol 
  const int BP=-1, EP=-2, NE=-3, EL=-4;
  tree <int> A;
  list <int> LA;
  // Este es otro ejemplo
  // int la[] = {BP,4,3,2,BP,1,BP,9,BP,8,6,5,2,EP,BP,7,4,1,EP,EP,EP,EP,EL};

  /* Debe imprimir:
     [mstorti@minerva example]$ ./mapprepost.bin 
     arbol A: (1 3 (5 6 7 8))
     map-pre-post(A): 1 3 1003 5 6 1006 7 1007 8 1008 1005 1001 
     [mstorti@minerva example]$ 
  */
  int la[] = {BP,1,3,BP,5,6,7,8,EP,EP,EL};
  insertl (LA,la,EL);
  list2tree (A,LA,BP,EP);
  cout << "arbol A: "; A.lisp_print(); cout << endl;

  list<int> L;
  map_pre_post(A,L,f,g);
  list<int>::iterator q = L.begin();
  cout << "map-pre-post(A): ";
  while (q!=L.end())
    cout << *q++ << " ";
  cout << endl;
}

Generated by GNU Enscript 1.6.6.