parcord.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Recordemos que un \'arbol es parcialmente ordenado si
dados dos nodos #m#, #n# tal que #m# es hijo de #n#,
entonces el valor de #m# es mayor o igual al de #n#.
Consigna: Escribir un predicado
#bool es_parcialmente_ordenado(tree<int> &T,bool (*comp)(int,int)#,
que verifica si el \'arbol ordenado
orientado #T# es parcialmente ordenado con respecto a la
funci\'on de comparaci\'on #comp()#.
[Tomado en el examen final 7/7/2005].
keywords: arbol orientado
FIN DE DESCRIPCION */
#include <cstdio>
#include "./util.h"
#include "./tree.h"
#include "./util_tree.h"
using namespace aed;
using namespace std;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool es_parcialmente_ordenado(tree<int> &T, tree<int>::iterator q,
bool (*comp)(int,int)) {
tree<int>::iterator c;
// Verifica que los valores nodales de los hijos sean mayores
// o iguales que el de los padres y que los subarboles sean PO.
c = q.lchild();
while (c!=T.end()) {
if (comp(*c,*q) ||
!es_parcialmente_ordenado(T,c,comp))
return false;
c++;
}
return true;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool es_parcialmente_ordenado(tree<int> &T,
bool (*comp)(int,int)) {
if (T.begin()==T.end()) return true;
return es_parcialmente_ordenado(T,T.begin(),comp);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool es_parcialmente_ordenado2(tree<int> &T, tree<int>::iterator q,
bool (*comp)(int,int)) {
tree<int>::iterator c;
// Verifica que los valores nodales de los hijos sean mayores
// o iguales que el de los padres
c = q.lchild();
while (c!=T.end())
if (comp(*c++,*q))
return false;
// Verifica que los subarboles de los hijos sean
// (recursivamente) parc. ord.
c = q.lchild();
while (c!=T.end())
if (!es_parcialmente_ordenado2(T,c++,comp))
return false;
return true;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool es_parcialmente_ordenado2(tree<int> &T,
bool (*comp)(int,int)) {
if (T.begin()==T.end()) return true;
return es_parcialmente_ordenado2(T,T.begin(),comp);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool int_less(int x,int y) {
return x < y;
}
bool int_greater(int x,int y) {
return x > y;
}
bool int_less_abs(int x,int y) {
return abs(x) < abs(y);
}
// -------------------------------------------------------------------
int main () {
const int BP=INT_MAX, EP=INT_MAX-1, NE=INT_MAX-2, EL=INT_MAX-3;
tree <int> A;
list <int> LA;
// (3 5 (7 9 10)) Es PO con respecto a < (less)
int la1[] = {BP,3,5,BP,7,9,10,EP,EP,EL};
// (3 5 (-7 9 -10)) Es PO con respecto a |a|<|b| (less_abs)
int la2[] = {BP,3,5,BP,-7,9,-10,EP,EP,EL};
// (7 5 (3 1 0)) Es PO con respecto a > (greater)
int la3[] = {BP,7,5,BP,3,1,0,EP,EP,EL};
for (int j=0; j<3; j++) {
LA.clear();
insertl(LA,(j==0? la1 : j==1? la2 : la3),EL);
A.clear();
list2tree(A,LA,BP,EP);
printf("arbol: "); A.lisp_print(); printf("\n");
for (int k=0; k<3; k++) {
// Aca `comp_p' es un puntero a funcion que
// va tomando las diferentes funciones de comparacion
// implementadas arriba.
bool (*comp_p)(int,int);
comp_p = (k==0? int_less : k==1? int_greater : int_less_abs);
const char *label = (k==0? "less" : k==1? "greater" : "less_abs");
printf("parc. ord. con respecto a %s? %d, (usando version 2: %d)\n",
label,
es_parcialmente_ordenado(A,comp_p),
es_parcialmente_ordenado2(A,comp_p));
}
}
}
// -------------------------------------------------------------------
Generated by GNU Enscript 1.6.6.