ordnodo.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Escribir una funci\'on predicado
#bool ordnodo(tree<int> &A);# que verifica si cada secuencia de
hermanos del sub\'arbol del nodo #n# (perteneciente
al \'arbol ordenado orientado #A# est\'an ordenadas
entre s\'\i{}, de izquierda a derecha. Por ejemplo, para
el \'arbol #(3 5 (6 1 3) (7 4 5))# deber\'\i{}a
retornar #true#, mientras que para
#(3 9 (6 1 3) (7 4 2))# deber\'\i{}a retornar #false#, ya que
las secuencias de hermanos #(9 6 7)# y #(4 2)#
NO est\'an ordenados. Se sugiere el siguiente algoritmo:
para un dado nodo retornar false si: 1) sus hijos no
estan ordenados o 2) algunos de sus hijos contiene en su
sub\'arbol una secuencia de hermanos no ordenada.
(recursividad). Caso contrario retorna verdadero.
[Tomado en el final del 28/7/2005].
keywords: arbol orientado
FIN DE DESCRIPCION */
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
#include <cstdio>
#include <queue>
#include "./tree.h"
#include "./util.h"
#include "./util_tree.h"
using namespace aed;
using namespace std;
// -------------------------------------------------------------------
bool ordnodo(tree<int> &t,tree<int>::iterator n) {
tree<int>::iterator c = n.lchild(), d;
// Buscar si hay dos hermanos c, d tales
// que *c>*d.
if (c==t.end()) return true;
d = c; d++;
while (d!=t.end()) {
if (*d<*c) return false;
c = d; d++;
}
// Verificar que el subarbol de cada hijo
// satisfaga la condicion.
c = n.lchild();
while (c!=t.end())
if (!ordnodo(t,c++)) return false;
// Si pasa todas las condiciones entonces
// retorna verdadero.
return true;
}
// -------------------------------------------------------------------
// Funcion `wrapper' llama a la funcion
// rercursiva con los parametros apropiados.
bool ordnodo(tree<int> &t) {
if (t.begin()==t.end()) return true;
return ordnodo(t,t.begin());
}
// -------------------------------------------------------------------
int main () {
tree<int> A;
// Genera arboles aleatorios y le aplica
// el predicado, imprimiendo el resultado.
for (int j=0; j<100; j++) {
A.clear();
make_random_tree (A, 10, 2);
printf("A: ");
A.lisp_print();
printf(", ordnodo(A) %d\n",ordnodo(A));
}
}
// -------------------------------------------------------------------
Generated by GNU Enscript 1.6.6.