100 lines
2.7 KiB
Factor
100 lines
2.7 KiB
Factor
! Copyright (c) 2012 Anonymous
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: accessors combinators deques dlists fry io kernel
|
|
math.parser ;
|
|
IN: rosetta-code.tree-traversal
|
|
|
|
! http://rosettacode.org/wiki/Tree_traversal
|
|
|
|
! Implement a binary tree where each node carries an integer,
|
|
! and implement preoder, inorder, postorder and level-order
|
|
! traversal. Use those traversals to output the following tree:
|
|
|
|
! 1
|
|
! / \
|
|
! / \
|
|
! / \
|
|
! 2 3
|
|
! / \ /
|
|
! 4 5 6
|
|
! / / \
|
|
! 7 8 9
|
|
|
|
! The correct output should look like this:
|
|
|
|
! 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
|
|
|
|
TUPLE: node data left right ;
|
|
|
|
CONSTANT: example-tree
|
|
T{ node f 1
|
|
T{ node f 2
|
|
T{ node f 4
|
|
T{ node f 7 f f }
|
|
f
|
|
}
|
|
T{ node f 5 f f }
|
|
}
|
|
T{ node f 3
|
|
T{ node f 6
|
|
T{ node f 8 f f }
|
|
T{ node f 9 f f }
|
|
}
|
|
f
|
|
}
|
|
}
|
|
|
|
: preorder ( node quot: ( data -- ) -- )
|
|
[ [ data>> ] dip call ]
|
|
[ [ left>> ] dip over [ preorder ] [ 2drop ] if ]
|
|
[ [ right>> ] dip over [ preorder ] [ 2drop ] if ]
|
|
2tri ; inline recursive
|
|
|
|
: inorder ( node quot: ( data -- ) -- )
|
|
[ [ left>> ] dip over [ inorder ] [ 2drop ] if ]
|
|
[ [ data>> ] dip call ]
|
|
[ [ right>> ] dip over [ inorder ] [ 2drop ] if ]
|
|
2tri ; inline recursive
|
|
|
|
: postorder ( node quot: ( data -- ) -- )
|
|
[ [ left>> ] dip over [ postorder ] [ 2drop ] if ]
|
|
[ [ right>> ] dip over [ postorder ] [ 2drop ] if ]
|
|
[ [ data>> ] dip call ]
|
|
2tri ; inline recursive
|
|
|
|
: (levelorder) ( dlist quot: ( data -- ) -- )
|
|
over deque-empty? [ 2drop ] [
|
|
[ dup pop-front ] dip {
|
|
[ [ data>> ] dip call drop ]
|
|
[ drop left>> [ swap push-back ] [ drop ] if* ]
|
|
[ drop right>> [ swap push-back ] [ drop ] if* ]
|
|
[ nip (levelorder) ]
|
|
} 3cleave
|
|
] if ; inline recursive
|
|
|
|
: levelorder ( node quot: ( data -- ) -- )
|
|
[ 1dlist ] dip (levelorder) ; inline
|
|
|
|
: levelorder2 ( node quot: ( data -- ) -- )
|
|
[ 1dlist ] dip
|
|
[ dup deque-empty? not ] swap '[
|
|
dup pop-front
|
|
[ data>> @ ]
|
|
[ left>> [ over push-back ] when* ]
|
|
[ right>> [ over push-back ] when* ] tri
|
|
] while drop ; inline
|
|
|
|
: tree-traversal-main ( -- )
|
|
example-tree [ number>string write bl ] {
|
|
[ "preorder: " write preorder nl ]
|
|
[ "inorder: " write inorder nl ]
|
|
[ "postorder: " write postorder nl ]
|
|
[ "levelorder: " write levelorder nl ]
|
|
[ "levelorder2: " write levelorder2 nl ]
|
|
} 2cleave ;
|
|
|
|
MAIN: tree-traversal-main
|