# The Computer LanguageBenchmarks Game

## binary-trees Chapel program

### source code

```/* The Computer Language Benchmarks Game
http://benchmarksgame.alioth.debian.org/

contributed by Casey Battaglino, Ben Harshbarger, and Brad Chamberlain
derived from the GNU C version by Jeremy Zerfas
*/

use DynamicIters;

config const n = 10;         // the maximum tree depth

proc main() {
const minDepth = 4,                      // the shallowest tree
maxDepth = max(minDepth + 2, n),   // the deepest normal tree
strDepth = maxDepth + 1,           // the depth of the "stretch" tree
depths = minDepth..maxDepth by 2;  // the range of depths to create
var stats: [depths] (int,int);           // stores statistics for the trees

//
// Create the "stretch" tree, checksum it, print its stats, and free it.
//
const strTree = new Tree(strDepth);
writeln("stretch tree of depth ", strDepth, "\t check: ", strTree.sum());
delete strTree;

//
// Build the long-lived tree.
//
const llTree = new Tree(maxDepth);

//
// Iterate over the depths in parallel, dynamically assigning them
// to tasks.  At each depth, create the required trees, compute
// their sums, and free them.
//
forall depth in dynamic(depths, chunkSize=1) {
const iterations = 2**(maxDepth - depth + minDepth);
var sum = 0;

for i in 1..iterations {
const t = new Tree(depth);
sum += t.sum();
delete t;
}
stats[depth] = (iterations, sum);
}

//
// Print out the stats for the trees of varying depths.
//
for depth in depths do
writeln(stats[depth](1), "\t trees of depth ", depth, "\t check: ",
stats[depth](2));

//
// Checksum the long-lived tree, print its stats, and free it.
//
writeln("long lived tree of depth ", maxDepth, "\t check: ", llTree.sum());
delete llTree;
}

//
// A simple balanced tree node class
//
class Tree {
var left, right: Tree;

//
// A Tree-building initializer
//
proc init(depth) {
if depth > 0 {
left  = new Tree(depth-1);
right = new Tree(depth-1);
}
}

//
// Add up tree node, freeing as we go
//
proc sum(): int {
var sum = 1;
if left {
sum += left.sum() + right.sum();
delete left;
delete right;
}
return sum;
}
}
```

### notes, command-line, and program output

```NOTES:
chpl Version 1.16.0

Wed, 25 Oct 2017 16:50:34 GMT

MAKE:
mv binarytrees.chapel binarytrees.chpl
/opt/src/chapel-1.16.0/bin/linux64/chpl --fast binarytrees.chpl -o binarytrees.chapel_run
rm binarytrees.chpl

11.54s to complete and log all make actions

COMMAND LINE:
./binarytrees.chapel_run --n=21

PROGRAM OUTPUT:
stretch tree of depth 22	 check: 8388607
2097152	 trees of depth 4	 check: 65011712
524288	 trees of depth 6	 check: 66584576
131072	 trees of depth 8	 check: 66977792
32768	 trees of depth 10	 check: 67076096
8192	 trees of depth 12	 check: 67100672
2048	 trees of depth 14	 check: 67106816
512	 trees of depth 16	 check: 67108352
128	 trees of depth 18	 check: 67108736
32	 trees of depth 20	 check: 67108832
long lived tree of depth 21	 check: 4194303
```