}
public static Object[] buildPerfectBinaryTree(
OptDirectedGraphBuilder builder, int levels
) {
OptDirectedNode root = (OptDirectedNode)builder.buildNode();
root.setInDegree(0);
root.setOutDegree(2);
builder.addNode(root);
FIFOQueue queue = new FIFOQueue((int)Math.pow(2, levels+1));
queue.enq(root);
//build a complete binary tree
// number of nodes = 2^(n+1) - 1
int level = 0;
while (level < levels) {
int nnodes = (int)Math.pow(2, level);
for (int i = 0; i < nnodes; i++) {
Node n = (Node)queue.deq();
OptDirectedNode ln = (OptDirectedNode) builder.buildNode();
if (level < levels-1) {
ln.setInDegree(1);
ln.setOutDegree(2);
}
else {
ln.setInDegree(1);
ln.setOutDegree(0);
}
OptDirectedNode rn = (OptDirectedNode) builder.buildNode();
if (level < levels-1) {
rn.setInDegree(1);
rn.setOutDegree(2);
}
else {
rn.setInDegree(1);
rn.setOutDegree(0);
}
Edge le = builder.buildEdge(n, ln);
Edge re = builder.buildEdge(n, rn);