我正在尝试编写一个Prolog谓词,根据给定的遍历顺序给出可能的二叉搜索树。我选择使用如下表示法来表示树:t(根节点, 左子树, 右子树)
,叶子节点只是t(数字)
,当子树不存在时其值为nil
。
以下是我目前为止的代码(仅适用于后序遍历):
post(nil, []).
post(t(X), [X]).
post(t(N, L, R), T) :-
post(L, TL), post(R, TR),
append([TL, TR, [N]], T).
这在某种程度上起到了不错的作用,但在另一方向上卡住了:
?- post(t(8, t(5, t(2), nil), t(12, t(9), t(16))), Trav).
Trav = [2, 5, 9, 16, 12, 8].
?- post(Tree, [2, 5, 9, 16, 12, 8]).
Tree = t(8, nil, t(12, nil, t(16, nil, t(9, nil, t(5, nil, t(2)))))) ;
Tree = t(8, nil, t(12, nil, t(16, nil, t(9, nil, t(5, nil, t(2, nil, nil)))))) ;
[execution hangs here]
我意识到post
不需要二叉搜索树,也就是说没有要求左子树中的所有节点都小于根节点,右子树中的所有节点都大于根节点,所以我写了这个:
tree(t(_)).
tree(nil).
tree(t(N, L, R)) :-
tree(L), tree(R),
( L = t(NL, _, _) -> NL < N ; true ),
( R = t(NR, _, _) -> NR > N ; true ).
我以为只需执行?- post(Tree, [...]), tree(Tree).
就能让Prolog返回实际的二叉搜索树,但我似乎已经卡在了生成可能的树上。
我该如何改进我的代码?这可行吗?
nil
或者t(Value, Left, Right)
,然后叶节点是t(Value, nil, nil)
。 - TA_intern