RosettaCodeData/Task/Tree-traversal/Oforth/tree-traversal.fth

32 lines
734 B
Forth

Object Class new: Tree(v, l, r)
Tree method: initialize(v, l, r) v := v l := l r := r ;
Tree method: v @v ;
Tree method: l @l ;
Tree method: r @r ;
Tree method: preOrder(f)
@v f perform
@l ifNotNull: [ @l preOrder(f) ]
@r ifNotNull: [ @r preOrder(f) ] ;
Tree method: inOrder(f)
@l ifNotNull: [ @l inOrder(f) ]
@v f perform
@r ifNotNull: [ @r inOrder(f) ] ;
Tree method: postOrder(f)
@l ifNotNull: [ @l postOrder(f) ]
@r ifNotNull: [ @r postOrder(f) ]
@v f perform ;
Tree method: levelOrder(f)
| c n |
Channel new self over send drop ->c
while(c notEmpty) [
c receive ->n
n v f perform
n l dup ifNotNull: [ c send ] drop
n r dup ifNotNull: [ c send ] drop
] ;