list2tree.cpp
//$Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Escribir una funcion #list2tree(tree<int> &T,list<int> &L);#
que dada una lista #L# con el orden previo de #T# y el tamano
de sus subarboles reconstruye #T#. La forma de almacenar el
arbol en #T# es la siguiente: se almacena en orden previo 2
valores enteros por cada nodo, a saber el contenido del nodo y
el numero de hijos. Por ejemplo para el arbol
#(6 4 8 (5 4 4) 7 9)# se tenemos
#L=(6 5 4 0 8 0 5 2 4 0 4 0 7 0 9 0)#.
Escribir tambien la funcion inversa #tree2list(tree<int> &T,list<int> &L);#
[Tomado en el 2do parcial de 2010, 2010-10-28]
Keywords: arbol orientado
FIN DE DESCRIPCION */
// -----------------------------------------------------------------
#include <cstdio>
#include <iostream>
#include "./util.h"
#include "./tree.h"
#include "./util_tree.h"
using namespace aed;
using namespace std;
typedef list<int> list_t;
typedef list<int>::iterator pos_t;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void tree2list(tree_t &T,node_t n,list_t &L) {
pos_t p = L.end();
p = L.insert(p,*n); p++;
p = L.insert(p,0);
int nchild = 0;
node_t c = n.lchild();
while (c!=T.end()) {
tree2list(T,c++,L);
nchild++;
}
*p = nchild;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void tree2list(tree_t &T,list_t &L) {
tree2list(T,T.begin(),L);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
node_t
list2tree(tree_t &T, node_t n,
list_t &L,pos_t &p) {
// Inserta el nodo
n = T.insert(n,*p++);
int nchild = *p++;
// Reconstruye los hijos
node_t c = n.lchild();
for (int j=0; j<nchild; j++) {
c = list2tree(T,c,L,p);
c++;
}
return n;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void list2tree(tree_t &T,list_t &L) {
pos_t p = L.begin();
list2tree(T,T.begin(),L,p);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
// Prueba con 20 arboles generados aleatoriamente
for (int j=0; j<20; j++) {
printf("-----------------\n");
tree_t T;
// Genera el arbol
make_random_tree(T,10,2);
printf("tree T: ");
T.lisp_print();
printf("\n");
// Lo convierte a lista
list_t L;
tree2list(T,L);
printl(L);
// Lo reconstruye en T2
tree_t T2;
list2tree(T2,L);
printf("Arbol reconstruido: ");
T2.lisp_print();
printf("\n");
}
// Este ejemplo es el que figuraba en el parcial
tree_t T;
list_t L;
// Debe dar T = (6 4 8 (5 4 4) 7 9)
add_to_list(L,-1,6,5,4,0,8,0,5,2,4,0,4,0,7,0,9,0,-1);
list2tree(T,L);
T.lisp_print();
printf("\n");
return 0;
}
Generated by GNU Enscript 1.6.6.