// start snippet binary-tree
function binaryTree(val, left, right) {
return function (command) {
if (command == "val") { return val; }
if (command == "left") { return left; }
if (command == "right") { return right; }
return null;
};
}
function binaryTreeVal(tree) { return tree("val"); }
function binaryTreeLeft(tree) { return tree("left"); }
function binaryTreeRight(tree) { return tree("right"); }
// end snippet binary-tree
// start snippet gen-tree
function generatePowersOfTwoBinaryTree(start) {
function generateTree(start, interval) {
if (start == 1) {
return binaryTree(1, null, null);
}
return binaryTree(start,
generateTree(start - interval/2, interval/2),
generateTree(start - interval/2, interval/2));
}
return generateTree(start, start);
}
// end snippet gen-tree
// start snippet print-tree-node
function printTreeNode(val, depth) {
var i = 0;
var padding = "┃━";
while (i < depth) {
padding = padding + "━━━━━━━━";
i = i + 1;
}
print(padding + " " + val);
}
// end snippet print-tree-node
// start snippet print-tree
function printBinaryTreeBreadthFirst(tree) {
function traverseTree(tree, depth) {
if (tree == null) { return; }
printTreeNode(binaryTreeVal(tree), depth);
spawn traverseTree(binaryTreeLeft(tree), depth + 1);
spawn traverseTree(binaryTreeRight(tree), depth + 1);
}
traverseTree(tree, 0);
}
// end snippet print-tree
// start snippet main
var tree = generatePowersOfTwoBinaryTree(16);
printBinaryTreeBreadthFirst(tree);
// end snippet main