树序前遍历Prolog

时间:2012-04-11 05:28:05

标签: prolog

树遍历是指以系统方式访问树数据结构中的每个节点的过程。前序遍历如下图所示

Sorted_binary_tree

返回F,B,A,D,C,E,G,I,H(根,左,右)。这是Prolog代码:

preorder(tree(X,L,R),Xs) :-
    preorder(L,Ls),
    preorder(R,Rs),
    append([X|Ls],Rs,Xs).
preorder(void,[]).

我会写一个返回的prolog程序

F,B,A,F,B,D,C,F,B,D,E,F,G,I,H

即树的路径。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

在将参数PathToRoot添加到 cons 当前节点之前,先将其添加到左/右访问者。

在返回之前,叶子谓词将统一接收的累加器与其反向。

根调用将有一个空累加器。

答案 1 :(得分:0)

尝试这个尺寸:

dfs_paths(tree(X, void, void), [X]) :- !.
dfs_paths(tree(X, L, _R), [X|Xs]) :-
    dfs_paths(L, Xs).
dfs_paths(tree(X, _L, R), [X|Xs]) :-
    dfs_paths(R, Xs).

使用表示来自here的树的事实来测试它:

tree(T) :- T = tree(f, tree(b, tree(a,void,void), tree(d,tree(c,void,void),tree(e,void,void))), tree(g, void, tree(i, tree(h,void,void),void))).

试用(不显示T的绑定):

?- tree(T), dfs_paths(T, L).
L = [f, b, a] ;
L = [f, b, d, c] ;
L = [f, b, d, e] ;
L = [f, g, i, h] 

请注意dfs_paths/2回溯以提供备用路径。如果您想预先列出这些列表,可以尝试:

?- tree(T), findall(P, dfs_paths(T, P), Ps).
Ps = [[f, b, a], [f, b, d, c], [f, b, d, e], [f, g, i, h]].

如果你想要一个如上所述的平面条款清单,你可以flatten/2结果。

相关问题