depthif.cpp

// $Id$
/* COMIENZO DE DESCRIPCION

   __USE_WIKI__
   Dados un arbol binario #T# encontrar la maxima profundidad de
   un nodo tal que satisface un predicado dado. 
   [Tomado en el 2do parcial del 2009-10-27].
   keywords: arbol binario

  FIN DE DESCRIPCION */

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
#include <cstdio>
#include <iostream>

#include "./btree.h"
#include "./util.h"
#include "./util_btree.h"

using namespace aed;
using namespace std;

typedef bool (* pred_t)(int);

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int depth_if(btree<int> &T,btree<int>::iterator n, pred_t pred) {
  if (n==T.end()) return -1;
  int dl,dr,dn,depth;
  dl = depth_if(T,n.left(),pred);
  dr = depth_if(T,n.right(),pred);
  depth = (dl>dr? dl : dr);
  return (depth>=0? depth+1 : pred(*n)? 0 : -1);
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Wrapper
int depth_if(btree<int> &T,pred_t pred) { 
  return depth_if(T,T.begin(),pred);
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool odd(int x) { return x%2; }
bool even(int x) { return !odd(x); }

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main () {
  btree<int> T;
  for (int j=0; j<10; j++) {
    T.clear();
    make_random_btree(T,10,0.5);
    printf("T: "); T.lisp_print(); 
    printf(", depth even: %d, odd %d\n",
           depth_if(T,even), depth_if(T,odd));
  }

  return 0;
}

Generated by GNU Enscript 1.6.6.