RosettaCodeData/Task/Tree-traversal/Prolog/tree-traversal.pro

57 lines
980 B
Prolog

tree :-
Tree= [1,
[2,
[4,
[7, nil, nil],
nil],
[5, nil, nil]],
[3,
[6,
[8, nil, nil],
[9,nil, nil]],
nil]],
write('preorder : '), preorder(Tree), nl,
write('inorder : '), inorder(Tree), nl,
write('postorder : '), postorder(Tree), nl,
write('level-order : '), level_order([Tree]).
preorder(nil).
preorder([Node, FG, FD]) :-
format('~w ', [Node]),
preorder(FG),
preorder(FD).
inorder(nil).
inorder([Node, FG, FD]) :-
inorder(FG),
format('~w ', [Node]),
inorder(FD).
postorder(nil).
postorder([Node, FG, FD]) :-
postorder(FG),
postorder(FD),
format('~w ', [Node]).
level_order([]).
level_order(A) :-
level_order_(A, U-U, S),
level_order(S).
level_order_([], S-[],S).
level_order_([[Node, FG, FD] | T], CS, FS) :-
format('~w ', [Node]),
append_dl(CS, [FG, FD|U]-U, CS1),
level_order_(T, CS1, FS).
level_order_([nil | T], CS, FS) :-
level_order_(T, CS, FS).
append_dl(X-Y, Y-Z, X-Z).