43 lines
1.1 KiB
Erlang
43 lines
1.1 KiB
Erlang
-module(tree_traversal).
|
|
-export([main/0]).
|
|
-export([preorder/2, inorder/2, postorder/2, levelorder/2]).
|
|
-export([tnode/0, tnode/1, tnode/3]).
|
|
|
|
-define(NEWLINE, io:format("~n")).
|
|
|
|
tnode() -> {}.
|
|
tnode(V) -> {node, V, {}, {}}.
|
|
tnode(V,L,R) -> {node, V, L, R}.
|
|
|
|
preorder(_,{}) -> ok;
|
|
preorder(F,{node,V,L,R}) ->
|
|
F(V), preorder(F,L), preorder(F,R).
|
|
|
|
inorder(_,{}) -> ok;
|
|
inorder(F,{node,V,L,R}) ->
|
|
inorder(F,L), F(V), inorder(F,R).
|
|
|
|
postorder(_,{}) -> ok;
|
|
postorder(F,{node,V,L,R}) ->
|
|
postorder(F,L), postorder(F,R), F(V).
|
|
|
|
levelorder(_, []) -> [];
|
|
levelorder(F, [{}|T]) -> levelorder(F, T);
|
|
levelorder(F, [{node,V,L,R}|T]) ->
|
|
F(V), levelorder(F, T++[L,R]);
|
|
levelorder(F, X) -> levelorder(F, [X]).
|
|
|
|
main() ->
|
|
Tree = tnode(1,
|
|
tnode(2,
|
|
tnode(4, tnode(7), tnode()),
|
|
tnode(5, tnode(), tnode())),
|
|
tnode(3,
|
|
tnode(6, tnode(8), tnode(9)),
|
|
tnode())),
|
|
F = fun(X) -> io:format("~p ",[X]) end,
|
|
preorder(F, Tree), ?NEWLINE,
|
|
inorder(F, Tree), ?NEWLINE,
|
|
postorder(F, Tree), ?NEWLINE,
|
|
levelorder(F, Tree), ?NEWLINE.
|