67 lines
1.4 KiB
Plaintext
67 lines
1.4 KiB
Plaintext
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)
|
|
$)
|