cumsum.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
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. Por ejemplo si #T=(1 (2 (3 4 5 6))))# entonces
despues de #cumsum(T)# debe quedar #T=(21 (2 (18 4 5 6))))#.
La version hacia abajo corresponde a que en cada camino
#n0,n1,...,nk# queden los valores #cumsum[*n0,*n1,...,*nk]#.
keywords: arbol orientado
FIN DE DESCRIPCION */
// -------------------------------------------------------------------
#include <cstdarg>
#include <cstdio>
#include <iostream>
#include <map>
#include <set>
#include <algorithm>
#include "./util.h"
#include "./tree.h"
#include "./util_tree.h"
using namespace aed;
using namespace std;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void cumsum(tree<int> &T,node_t p) {
node_t c = p.lchild();
while (c!=T.end()) {
cumsum(T,c);
*p += *c++;
}
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Wrapper
void cumsum(tree<int> &T) {
if (!T.empty()) cumsum(T,T.begin());
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void cumsum_down(tree<int> &T,node_t n,int sumup) {
*n += sumup;
node_t c = n.lchild();
while (c!=T.end()) cumsum_down(T,c++,*n);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Wrapper
void cumsum_down(tree<int> &T) {
if (!T.empty()) cumsum_down(T,T.begin(),0);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
tree<int> T;
for (int j=0; j<10; j++) {
T.clear();
make_random_tree(T,10,2.0);
printf("T: "); T.lisp_print(); printf("\n");
cumsum(T);
printf("after cumsum(T)\n");
printf("T: "); T.lisp_print(); printf("\n");
printf("------------\n");
}
for (int j=0; j<10; j++) {
T.clear();
make_random_tree(T,10,2.0);
printf("T: "); T.lisp_print(); printf("\n");
cumsum_down(T);
printf("after cumsum_down(T)\n");
printf("T: "); T.lisp_print(); printf("\n");
printf("------------\n");
}
return 0;
}
Generated by GNU Enscript 1.6.6.