Prolog Postorder使用univ在一般树中遍历

时间:2013-11-20 19:37:44

标签: tree prolog postorder

我试图以后序方式遍历prolog中的一般树。我发现了很多二叉树后序遍历,但不能将它们用于我的目的。我写了一个程序,但它只打印我的树,方式与输入方式相反,即输入

?-postorder(a(b,c,d(e,f,g))).
->g f e d c b a true (is what I get)
->b c e f g d a true (what i want to get)

这是我到目前为止编写的代码

postorder([]).
postorder(List):- List =..X , myfun(X).
myfun([A|B]):- atom(A), myfun(B),write(A),write(' ').
myfun([A|B]):- postorder(A),myfun(B).
myfun([]).

我没有办法进行后序遍历 非常感谢任何帮助

3 个答案:

答案 0 :(得分:0)

你的参数命名有点令人困惑

postorder(List):- List =..X , myfun(X).

应该阅读

postorder(Struct):- Struct =.. List, myfun(List).

现在应该更清楚你必须在那里编写结构仿函数:

postorder(Struct):-
  Struct =.. [Functor|Arguments], myfun(Arguments), write(Functor).

此时,你也应该更换myfun ......

作为一个例子,这是问题的紧凑解决方案

postorder(X) :- X =.. [H|As], maplist(postorder, As), write(H).

产生

?- postorder(a(b,c,d(e,f,g))).
bcefgda

答案 1 :(得分:0)

另一种方法 -

建议 - 我会以不同的方式构建您的树,具体而言,树形式为

tree(Value,[Subtrees])

其中value类似a,然后列表是子树列表。叶子具有空列表[]

如果这样做,您可以使用此算法利用统一 -

postorder(tree(VAL,[Child1|ChildList])) :- postorder(Child1),postorder(tree(VAL,ChildList)).
postorder(tree(VAL,[])) :- write(VAL).

输出:

?- postorder(tree(a,[tree(b,[]),tree(c,[]),tree(d,[tree(e,[]),tree(f,[]),tree(g,[])])])).
bcefgda
true .

答案 2 :(得分:0)

这个解决方案对我来说很合适。

postorder([]).
postorder(Tree):- Tree =..[Parent|Children] , myfun(Children), write(Parent),write(' ').
myfun([First|Next]):- atom(First), write(First), write(' '), myfun(Next).
myfun([First|Next]):- postorder(First),myfun(Next).
myfun([]).