树遍历是指以系统方式访问树数据结构中的每个节点的过程。以下图片中的postorder
遍历
返回A, C, E, D, B, H, I, G, F (left, right, root)
。 PREORDER
遍历的Prolog代码是
preorder(tree(X,L,R),Xs) :-
preorder(L,Ls),
preorder(R,Rs),
append([X|Ls],Rs,Xs).
preorder(void,[]).
我想修改上面的代码来实现postorder遍历。
答案 0 :(得分:5)
有人请在编写列表时考虑使用DCG,例如:
preorder(void) --> [].
preorder(tree(X, L, R)) -->
[X],
preorder(L),
preorder(R).
用法:
?- phrase(preorder(Tree), List).
您可以通过简单地决定将[X]放在序列中的位置来获得不同的订单。
答案 1 :(得分:0)
如果是后序,则必须遍历左侧分支并获取节点值Left
的列表,然后遍历右侧分支并获取节点值Right
的列表,最后返回左,右和node value
的连接。
因此,修改代码将重新排列实例化结果列表的方式:
postorder(tree(X, L, R), Xs):-
postorder(L, Ls),
postorder(R, Rs),
append(Ls, Rs, Xs1),
append(Xs1, [X], Xs).
postorder(void, []).
但请注意,此代码在尾部递归时并非次优。你应该考虑在累加器的帮助下实现它。