Prolog中的树后序遍历

时间:2012-05-08 18:51:49

标签: prolog dcg

树遍历是指以系统方式访问树数据结构中的每个节点的过程。以下图片中的postorder遍历

Sorted_binary_tree

返回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遍历。

2 个答案:

答案 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, []).

但请注意,此代码在尾部递归时并非次优。你应该考虑在累加器的帮助下实现它。