get "libhdr" manifest $( VAL=0 LEFT=1 RIGHT=2 $) let tree(v,l,r) = valof $( let obj = getvec(2) obj!VAL := v obj!LEFT := l obj!RIGHT := r resultis obj $) let preorder(tree, cb) be unless tree=0 $( cb(tree!VAL) preorder(tree!LEFT, cb) preorder(tree!RIGHT, cb) $) let inorder(tree, cb) be unless tree=0 $( inorder(tree!LEFT, cb) cb(tree!VAL) inorder(tree!RIGHT, cb) $) let postorder(tree, cb) be unless tree=0 $( postorder(tree!LEFT, cb) postorder(tree!RIGHT, cb) cb(tree!VAL) $) let levelorder(tree, cb) be $( let q=vec 255 let s=0 and e=1 q!0 := tree until s=e do $( unless q!s=0 do $( q!e := q!s!LEFT q!(e+1) := q!s!RIGHT e := e+2 cb(q!s!VAL) $) s := s+1 $) $) let traverse(name, order, tree) be $( let cb(n) be writef("%N ", n) writef("%S:*T", name) order(tree, cb) wrch('*N') $) let start() be $( let example = tree(1, tree(2, tree(4, tree(7, 0, 0), 0), tree(5, 0, 0)), tree(3, tree(6, tree(8, 0, 0), tree(9, 0, 0)), 0)) traverse("preorder", preorder, example) traverse("inorder", inorder, example) traverse("postorder", postorder, example) traverse("level-order", levelorder, example) $)