contenido.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
Escribir una funci\'on predicado
{\tt bool contenido(btree<int> \&A, btree<int> \&B);}
que retorna verdadero si la estructura del \'arbol binario {\tt A}
esta ``contenido'' dentro de la de {\tt B} y las etiquetas
correspondientes de {\tt A} son menores que las de {\tt B+}.
[Tomado en el examen 2do parcial del 27/5/2004].
keywords: arbol binario
FIN DE DESCRIPCION */
// -------------------------------------------------------------------
/* Por Ejemplo, si
T1=(1 (2 3 .) (5 2 4)),
T2=(0 2 (3 2 .)),
T3=(3 2 (3 2 .)) y
T4=(0 (2 . 3) (3 2 .)),
entonces
contenido(T2,T1) retorna true
contenido(T3,T1) retorna false
contenido(T4,T1) retorna false
En los casos que debe retornar false, el nodo que viola la condici\'on
est\'a marcado. Se sugiere escribir una funci\'on auxiliar recursiva.
*/
// --------------------------!----------------------------------------
#include "./btree.h"
#include "./util.h"
#include "./util_btree.h"
using namespace aed;
using namespace std;
// -------------------------------------------------------------------
bool contenido(btree<int> &A,btree<int>::iterator na,
btree<int> &B,btree<int>::iterator nb) {
if (na==A.end()) return true;
if (nb==B.end()) return false;
if (*na>*nb) return false;
if (!contenido(A,na.left(),B,nb.left())) return false;
if (!contenido(A,na.right(),B,nb.right())) return false;
return true;
}
bool contenido(btree<int> &A,btree<int> &B) {
return contenido(A,A.begin(),B,B.begin());
}
// -------------------------------------------------------------------
int main () {
btree <int> A, B;
for (int j=0; j<10; j++) {
A.clear();
make_random_btree (A, 10, 0.8);
B=A;
btree<int>::iterator n = B.begin();
while(n!=B.end())
n = (drand()>0.5 ? n.left() : n.right());
B.insert(n,irand(10));
cout << "A: " << endl;
A.lisp_print();
cout << endl;
cout << "B: " << endl;
B.lisp_print();
cout << endl;
#define CONT(A,B) cout << #A " contenido en " #B \
": " << (contenido(A,B) ? "si" : "no") << endl;
CONT(A,A);
CONT(A,B);
CONT(B,A);
CONT(B,B);
}
cout << "-----------------------------" << endl;
double prob=0.3;
for (int j=0; j<10; j++) {
cout << "-----\n";
A.clear();
make_random_btree (A, 3, prob);
cout << "A: " << endl;
A.lisp_print();
cout << endl;
B.clear();
make_random_btree (B, 10, 3.0*prob);
cout << "B: " << endl;
B.lisp_print();
cout << endl;
CONT (A,B);
}
cout << endl ;
return 0 ;
} // end main
// -------------------------------------------------------------------
Generated by GNU Enscript 1.6.6.