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]在序列中的位置,可以得到不同的顺序