考虑一棵有n个节点的二叉树。举例来说,考虑以下树形结构:
1
/ \
2 3
/ \ / \
4 5 6 7
\
8
从根节点开始,只移动到已经访问过的直接连接节点(例如,我可以从1到2到4,然后到3),我有多少种完全遍历树的不同方式?
1
/ \
2 3
/ \ / \
4 5 6 7
\
8
从根节点开始,只移动到已经访问过的直接连接节点(例如,我可以从1到2到4,然后到3),我有多少种完全遍历树的不同方式?
使用Prolog进行@deinst答案的程序化验证:
traverse([], []) :- !.
traverse(F, [N|P]) :-
% select a frontier node from F
select(t(N,C), F, Rem),
% append all new accessible children to the frontier
append(C, Rem, NewF),
% traverse the remaining set
traverse(NewF, P).
tree(X) :-
X = t(1,[t(2,[t(4,[]), t(5,[])]),t(3,[t(6,[]), t(7,[t(8,[])])])]).
do :-
tree(X),
findall(P, (traverse([X], P), write_ln(P)), Ps),
length(Ps, L),
write_ln(L).
?- do.
[1,2,4,5,3,6,7,8]
[1,2,4,5,3,7,8,6]
[1,2,4,5,3,7,6,8]
[1,2,4,3,6,7,8,5]
[1,2,4,3,6,7,5,8]
[1,2,4,3,6,5,7,8]
[1,2,4,3,7,8,6,5]
[1,2,4,3,7,8,5,6]
[1,2,4,3,7,6,8,5]
...
[1,3,2,7,6,4,8,5]
[1,3,2,7,6,4,5,8]
[1,3,2,7,6,5,8,4]
[1,3,2,7,6,5,4,8]
210
true.