我试图以后序方式遍历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([]).
我没有办法进行后序遍历 非常感谢任何帮助
答案 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([]).