prolog从左到右遍历非标准树

时间:2015-06-07 00:48:37

标签: tree prolog tree-traversal

我需要实现一个执行左边的谓词trav(Tree,List) 正确的树遍历;

其中:树由结构节点(左,右)定义,其中左侧和右侧可以是另一个节点或任何Prolog数据项。 List是树中叶节点值的列表。

例如:

?- trav(x,L).
L = [x].
?- trav(node(1,node(2,node(a,b))),L).
L = [1, 2, a, b] .

到目前为止我所拥有的:

trav(tree,[ ]).
trav(node(Left,Rigth), L) :-
    trav(Left, L),
    trav(Right, L),
    append(Left,[Left|Right],L).

1 个答案:

答案 0 :(得分:1)

我的Prolog略显生锈,但我相信这应该做到:

node(Left, Right).

trav(node(Left, Right), L) :- 
  trav(Left, L1), 
  trav(Right, L2),
  append(L1, L2, L).
trav(X, [X]) :- X \= node(A, B).

直观地,trav(Left, L1)表示遍历左子树,将每个元素存储在L1中。 trav(Right, L2)表示遍历存储L2中每个元素的右子树。最后,append(L1, L2, L)将两个列表L1 and L2附加到列表L中。对于一个叶子trav(X, [X]),只要它不与X统一,就会将node放入单个列表中。