package test.math;
/* The Great Computer Language Shootout
http://shootout.alioth.debian.org/
contributed by Jarkko Miettinen
*/
public class Binarytrees {
private final static int minDepth = 4;
public static void main(String[] args) {
int n = 0;
if (args.length > 0)
n = Integer.parseInt(args[0]);
int maxDepth = (minDepth + 2 > n) ? minDepth + 2 : n;
int stretchDepth = maxDepth + 1;
int check = (TreeNode.bottomUpTree(0, stretchDepth)).itemCheck();
System.out.println("stretch tree of depth " + stretchDepth + "\t check: " + check);
TreeNode longLivedTree = TreeNode.bottomUpTree(0, maxDepth);
for (int depth = minDepth; depth <= maxDepth; depth += 2) {
int iterations = 1 << (maxDepth - depth + minDepth);
check = 0;
for (int i = 1; i <= iterations; i++) {
check += (TreeNode.bottomUpTree(i, depth)).itemCheck();
check += (TreeNode.bottomUpTree(-i, depth)).itemCheck();
}
System.out.println((iterations * 2) + "\t trees of depth " + depth + "\t check: " + check);
}
System.out.println("long lived tree of depth " + maxDepth + "\t check: " + longLivedTree.itemCheck());
}
private static class TreeNode {
private TreeNode left, right;
private int item;
TreeNode(int item) {
this.item = item;
}
private static TreeNode bottomUpTree(int item, int depth) {
if (depth > 0) {
return new TreeNode(bottomUpTree(2 * item - 1, depth - 1), bottomUpTree(2 * item, depth - 1), item);
} else {
return new TreeNode(item);
}
}
TreeNode(TreeNode left, TreeNode right, int item) {
this.left = left;
this.right = right;
this.item = item;
}
private int itemCheck() {
// if necessary deallocate here
if (left == null)
return item;
else
return item + left.itemCheck() - right.itemCheck();
}
}
}