splitd.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Dados dos enteros #M# y #n#, tales que #n<M# crear un
arbol binario completo (ABC) #T# tal que: 1) La suma de
las hojas es #M#, pero cada una de ellas es #h<=n#. 2) Se
satisface que para cada nodo #n# la suma de sus dos hijos
#l# y #r# es #n=l+r#. Ayuda: El arbol se puede construir
poniendo inicialmente #M# en la raiz, y dividiendo cada nodo
por 2 hasta obtener valores #<=n#.
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;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void split_down(btree<int> &T, btree<int>::iterator p,int n) {
// Se supone que `p' es dereferenciable. Fijarse
// que despues le aplica el `split_down()' solo a nodos
// dereferenciables.
// Si el contenido del nodo es menor que `n' ya esta.
if (*p <= n) return;
// Divide el contenido de `p' en `r' y `l'
// de tal manera que son approx *p/2
// (pero la suma se preserva)
int r = *p/2, l = *p-r;
// Inserta los nuevos nodos y les aplica
// recursivamente el `split_down()'
T.insert(p.left(),r);
split_down(T,p.left(),n);
T.insert(p.right(),l);
split_down(T,p.right(),n);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Wrapper
void split_down(int M,btree<int> &T,int n) {
T.clear();
// Inicialmente inserta `M' en la raiz.
// Notar que esto garantiza que despues
// la `split_down()' recursiva se aplica solo
// a nodos dereferenciables.
T.insert(T.begin(),M);
split_down(T,T.begin(),n);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main () {
btree<int> T;
// Prueba con dos juegos de valores
int M=10, n=2;
split_down(M,T,n);
printf("M %d, n %d, T: ",M,n);
T.lisp_print();
printf("\n");
M=100; n=7;
split_down(M,T,n);
printf("M %d, n %d, T: ",M,n);
T.lisp_print();
printf("\n");
return 0;
}
Generated by GNU Enscript 1.6.6.