}
public static Object[] buildPerfectBinaryTree(
OptGraphBuilder builder, int levels
) {
OptNode root = (OptNode)builder.buildNode();
root.setDegree(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();
OptNode ln = (OptNode) builder.buildNode();
if (level < levels-1) ln.setDegree(3);
else ln.setDegree(1);
OptNode rn = (OptNode) builder.buildNode();
if (level < levels-1) rn.setDegree(3);
else rn.setDegree(1);
Edge le = builder.buildEdge(n, ln);
Edge re = builder.buildEdge(n, rn);
builder.addNode(ln);