verifsum_bo.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
En un programa de dise\~no asistido por computadora
(tipo AutoCAD) se desea mantener las piezas de un sistema
(por ejemplo un auto) clasificando sus partes en la forma
de un \'arbol, donde sus nodos interiores representan
sistemas del auto (planta motriz, direccion, carroceria),
sus hijos subs-sistemas y asi siguiendo hasta las hojas
que son los componentes indivisibles del automovil (por
ej. el tornillo de fijaci\'on del espejo retrovisor
izquierdo).
Se quiere mantener en cada hoja el peso (en Kilogramos)
del componente, y en los nodos interiores el peso total
de todos los componentes del sub\'arbol que cuelga de ese
nodo. Peri\'odicamente se quiere verificar que efectivamente
las etiquetas del \'arbol verifican esta propiedad, es
decir que la etiqueta de los nodos interiores es la
suma de las hojas del sub\'arbol que cuelga de \'el.
Escribir una funcion bool verif\_sum (tree <int> &T, node_t n)
que retorna true si el subarbol que cuelga del nodo verifica
la condicion dada y false en caso contrario. Usar las
primitivas del TAD Arbol Ordenado orientado.
[Tomado en el segundo parcial del cursado 2002, 28/5/2002.]
keywords: arbol orientado
FIN DE DESCRIPCION */
// -----------------------------------------------------------------
#include <iostream>
#include "./util.h"
#include "./tree.h"
#include "./util_tree.h"
using namespace aed;
using namespace std;
// -------------------------------------------------------------------
bool verif_sum ( tree <int> & T, node_t n ) {
node_t c ;
int s ;
// primero verifica si el nodo "n" no es lambda
if ( n == T.end () ) return true ;
c = n.lchild () ;
if ( c == T.end () )
return true ; // si el nodo es hoja esta OK
else {
s = 0 ;
while ( c != T.end () ) {
// llamada recursiva sobre cada hijo del nodo "n"
// si no satisface la condicion aborta
if ( !verif_sum (T,c) ) return false ;
// acumula las etiquetas de los hijos
s = s + *c ;
c++;
} // end while
// verifica que la suma sea igual a la etiqueta del nodo
return (s == *n ) ;
} // end if
} // end bool
// -------------------------------------------------------------------
int main () {
tree <int> t0, t1, t2, t3, t4 ;
list <int> l1, l2, l3, l4 ;
const int BP = -2, EP = -1, EL = -3;
int v1 [] = {BP,3,1,2,EP,EL};
int v2 [] = {BP,6,4,5,EP,EL};
int v3 [] = {BP,21,BP,7,1,2,4,EP,BP,12,6,
BP,5,3,2,EP,1,EP,BP,2,2,EP,EP,EL};
int v4 [] = {BP,1,BP,5,0,2,4,EP,BP,7,3,
BP,1,6,9,EP,8,EP,BP,2,3,EP,EP,EL};
bool b0, b1, b2, b3, b4 ;
cout << endl;
cout << "verifica suma en arbol orientado " << endl ;
cout << endl;
t0.clear ();
b0 = verif_sum ( t0, t0.begin () ) ;
cout << "verif_sum (lambda) = " << b0 << endl ;
cout << endl;
l1.clear ();
insertl (l1, v1, EL);
t1.clear ();
list2tree (t1, l1, BP, EP);
print_tree (t1);
b1 = verif_sum ( t1, t1.begin () ) ;
cout << "verif_sum (t1) = " << b1 << endl ;
cout << endl;
l2.clear ();
insertl (l2, v2, EL);
t2.clear ();
list2tree (t2, l2, BP, EP);
print_tree (t2);
b2 = verif_sum ( t2, t2.begin () ) ;
cout << "verif_sum (t2) = " << b2 << endl ;
cout << endl;
l3.clear ();
insertl (l3, v3, EL);
t3.clear ();
list2tree (t3, l3, BP, EP);
print_tree (t3);
b3 = verif_sum ( t3, t3.begin () ) ;
cout << "verif_sum (t3) = " << b3 << endl ;
cout << endl;
l4.clear ();
insertl (l4, v4, EL);
t4.clear ();
list2tree (t4, l4, BP, EP);
print_tree (t4);
b4 = verif_sum ( t4, t4.begin () ) ;
cout << "verif_sum (t4) = " << b4 << endl ;
cout << endl;
cout << endl ;
return 0 ;
} // end main
// -------------------------------------------------------------------
Generated by GNU Enscript 1.6.6.