Prolog中的树后序遍历

Prolog中的树后序遍历,prolog,dcg,Prolog,Dcg,树遍历是指系统地访问树数据结构中的每个节点的过程。下图中的后序遍历 返回A、C、E、D、B、H、I、G、F(左、右、根)。PREORDER遍历的序言代码为 preorder(tree(X,L,R),Xs) :- preorder(L,Ls), preorder(R,Rs), append([X|Ls],Rs,Xs). preorder(void,[]). 我想修改上面的代码以实现postorder遍历。如果是postorder,您必须遍历左分支并获得一个节点值列表l

树遍历是指系统地访问树数据结构中的每个节点的过程。下图中的
后序
遍历

返回
A、C、E、D、B、H、I、G、F(左、右、根)
PREORDER
遍历的序言代码为

preorder(tree(X,L,R),Xs) :-
    preorder(L,Ls),
    preorder(R,Rs),
    append([X|Ls],Rs,Xs).

preorder(void,[]).

我想修改上面的代码以实现postorder遍历。

如果是postorder,您必须遍历左分支并获得一个节点值列表
left
,然后遍历右分支并获得一个节点值列表
right
,最后返回left的串联,右键和
节点值

因此,修改代码就是重新安排实例化结果列表的方式:

postorder(tree(X, L, R), Xs):-
  postorder(L, Ls),
  postorder(R, Rs),
  append(Ls, Rs, Xs1),
  append(Xs1, [X], Xs).
postorder(void, []).

但是,请注意,从不是尾部递归的角度来看,此代码是次优的。你应该考虑在累加器的帮助下实现它。

< P>,在描述列表时,请考虑使用DCG,例如:

preorder(void) --> [].
preorder(tree(X, L, R)) -->
        [X],
        preorder(L),
        preorder(R).
用法:

?- phrase(preorder(Tree), List).
通过简单地决定[X]在序列中的位置,可以得到不同的顺序