Tree traversal: Difference between revisions
Content added Content deleted
Not a robot (talk | contribs) (Add Miranda) |
Not a robot (talk | contribs) (Add BCPL) |
||
Line 2,318: | Line 2,318: | ||
& |
& |
||
)</syntaxhighlight> |
)</syntaxhighlight> |
||
=={{header|BCPL}}== |
|||
<syntaxhighlight lang="bcpl">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) |
|||
$)</syntaxhighlight> |
|||
{{out}} |
|||
<pre>preorder: 1 2 4 7 5 3 6 8 9 |
|||
inorder: 7 4 2 5 1 8 6 9 3 |
|||
postorder: 7 4 5 2 8 9 6 3 1 |
|||
level-order: 1 2 3 4 5 6 7 8 9</pre> |
|||
=={{header|C}}== |
=={{header|C}}== |