cumsum-ab.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Igual a #cumsum.cpp# pero ahora para AB.
El #cumsum(v)# de un vector #v# es la suma acumulada, es
decir en la posicion #v[j]# debe quedar la suma de los
elementos de #v[0..j]#. Para un arbol lo podemos extender
diciendo que en cada nodo del arbol queda la suma de los
valores de los nodos de su subarbol ANTES de la
operacion.
keywords: arbol binario
FIN DE DESCRIPCION */
// -------------------------------------------------------------------
#include <cstdarg>
#include <cstdio>
#include <iostream>
#include <map>
#include <set>
#include <algorithm>
#include "./util.h"
#include "./btree.h"
#include "./util_btree.h"
using namespace aed;
using namespace std;
typedef btree<int>::iterator node_t;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void cumsum_down(btree<int> &T,node_t p, int sum) {
// sum es la suma acumulada hasta el padre de p
if (p==T.end()) return;
// actualiza el valor de p
*p += sum;
// propaga a los hijos
cumsum_down(T,p.left(),*p);
cumsum_down(T,p.right(),*p);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Wrapper
void cumsum_down(btree<int> &T) {
cumsum_down(T,T.begin(),0);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void cumsum_up(btree<int> &T,node_t p) {
if (p==T.end()) return;
node_t l = p.left(), r = p.right();
// aplica a los hijos
cumsum_up(T,l);
cumsum_up(T,r);
// actualiza el valor de p
if (l!=T.end()) *p += *l;
if (r!=T.end()) *p += *r;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Wrapper
void cumsum_up(btree<int> &T) {
cumsum_up(T,T.begin());
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
btree<int> T, Tcpy;
for (int j=0; j<10; j++) {
// genera un arbol aleatorio, guarda la copia en Tcpy
T.clear();
make_random_btree(T,10,0.5);
Tcpy = T;
printf("T: "); T.lisp_print();
printf("\n");
// aplica cumsum_down e imprime
cumsum_down(T);
printf("after cumsum_down(T):");
T.lisp_print(); printf("\n");
// aplica cumsum_up e imprime
cumsum_up(Tcpy);
printf("after cumsum_up(T):");
Tcpy.lisp_print();
printf("\n--------\n");
}
return 0;
}
Generated by GNU Enscript 1.6.6.