我试图通过将中序列表转回 BST 来“反转”中序遍历。
BSTs 有谓词形式node(Value,Left,Right)
or leaf
,所以空树就是leaf
,只有一个节点的树就是node(_,leaf,leaf)
。
给定谓词enumerate_bst(Elems,Bst)
,目标是匹配Bst
中序列表的所有可能性Elems
。例如(注意setof/3):
?- setof(Bst,enumerate_bst([],Bst),Enum).
Enum = [leaf].
?- setof(Bst,enumerate_bst([1,2],Bst),Enum).
Enum = [
node(1, leaf, node(2, leaf, leaf)),
node(2, node(1, leaf, leaf), leaf)
].
?- setof(Bst,enumerate_bst([1,2,3],Bst),Enum).
Enum = [
node(1, leaf, node(2, leaf, node(3, leaf, leaf))),
node(1, leaf, node(3, node(2, leaf, leaf), leaf)),
node(2, node(1, leaf, leaf), node(3, leaf, leaf)),
node(3, node(1, leaf, node(2, leaf, leaf)), leaf),
node(3, node(2, node(1, leaf, leaf), leaf), leaf)
].
我试图做的事情:
我已经有一个谓词将给定的 BST 与它的中序列表相匹配:
inorder(leaf,[]).
inorder(node(X,L,R),Elems) :-
inorder(L,Elems_L),
inorder(R,Elems_R),
append(Elems_L,[X],Tmp),
append(Tmp,Elems_R,Elems).
我试图通过放入一个列表来反向使用它,但这只返回一个结果,我不确定为什么。
我目前正在尝试做的事情
我正在尝试反向使用本机谓词append/3,但无法完全决定如何完成。
关于做到这一点的最佳方法的任何想法?谢谢!