1

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

?-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([]).

我没有得到后序遍历的方法
非常感谢任何帮助

4

3 回答 3

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([]).
于 2013-11-22T20:58:14.797 回答
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 .
于 2013-11-20T20:35:53.473 回答
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
于 2013-11-20T20:27:34.733 回答