map2count.cpp

// $Id$
/* COMIENZO DE DESCRIPCION

   __USE_WIKI__
   Escribir una funcion 
   #void map2count(tree<int> &A,tree<int> &B);# que construye un arbol #B#
   a partir de otro dado #A# tal que #B# tiene la misma estructura
   que #A#, y el valor en el nodo #nB# de #B# es la cantidad de
   hojas en el subarbol del nodo correspondiente #nA# en #A#. 

   [Tomado en el final de 2012-12-06].  
   keywords: arbol orientado

  FIN DE DESCRIPCION */
// -------------------------------------------------------------------
#include <cstdarg>
#include <cstdio>

#include <iostream>
#include <map>
#include <set>
#include <algorithm>
#include "./util.h"
#include "./tree.h"
#include "./util_tree.h"

using namespace aed;
using namespace std;

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
typedef tree<int> tree_t;
typedef tree<int>::iterator node_t;

#if 1
void map2count(tree<int> &A, tree<int> &B, 
               tree<int>::iterator n){
  if (n==B.end()) return;

  if(n.lchild()==B.end()) { *n=1; return;   }

  *n=0;
  tree<int>::iterator c = n.lchild();
  while (c!=B.end()) { 
    map2count(A,B,c);
    *n += *c;
    c++;
  }
}

void map2count(tree<int> &A, tree<int> &B){
  B.clear();
  B=A;
  map2count(A,B,B.begin());
}

#else
node_t map2count(tree_t &A,node_t a,tree_t &B,node_t b) {
  node_t ca = a.lchild();
  // Es una hoja
  if (ca==A.end())  {
    b = B.insert(b,1);
    return b;
  }
  // Crea el nodo `b' en `B', todavia no conoce
  // el valor, le pone 0
  b = B.insert(b,0);
  node_t cb = b.lchild();
  int hojas=0;
  while (ca!=A.end()) {
    cb = map2count(A,ca,B,cb);
    hojas += *cb;
    cb++; ca++;
  }
  *b = hojas;
  return b;
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void map2count(tree_t &A,tree_t &B) {
  B.clear();
  if (A.begin() == A.end()) return;
  map2count(A,A.begin(),B,B.begin());
}
#endif

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
  // TEST 2
  int N=50;
  // Genera N arboles aleatorios y los ordena
  // (ahi usa la funcion de comparacion)  
  printf("----------------\nNO ORDENADOS:\n");
  tree_t A,B;
  for (int j=0; j<N; j++) {
    make_random_tree2(A,20,10,2.0);
    printf("--------\nA: ",j);
    A.lisp_print();
    printf("\n");
    map2count(A,B);
    printf("map2count(A): ");
    B.lisp_print();
    printf("\n");
  }
  printf("\n");
  return 0;
}

Generated by GNU Enscript 1.6.6.