Prolog中序遍历
Prolog in-order traversal
节点示例如下:
node(3, nil, 14).
node(14, nil, 15).
node(15, nil, 92).
我在这里看到过类似的问题,但是我的不同,因为我的节点在参数中有 3 个值而不是 2 个值。
示例 运行:
?- inOrder(3, X).
X = [3, 14, 15, 35, 65, 89, 92] .
我当前的代码是:
% the in-order traversal of a leaf is the leaf
inOrder(X, [X]) :-
node(X, nil, nil).
% if the node only has a left child, we traverse that
inOrder(x, [X|T]) :-
node(X, L, [X|T]),
inOrder(L, T).
% if the node only has a right child we traverse that
inOrder(x, [X|T]) :-
node(X, nil, R),
inOrder(R, T).
% if the node has both, we traverse them both.
inOrder(x, [X|T]) :-
node(L, X, R),
L \= nil, R \= nil,
inOrder(L, T1),
inOrder(R, T2),
append(T1, T, T2).
它 returns false 而不是实际值。
您在 inOrder
的递归案例中使用了小写字母 x
;那应该是一个变量。但这可能不是唯一的问题。
您的陈述有几处曲折。一般来说,树状结构在数据库中并没有被压平,这里用 node/3
,而是保持在一个词项中。
此外,坚持每个节点都有自己的事实似乎是个好主意。在您的示例中,92 需要一个事实!
所以考虑到所有这些预防措施,我们可以使用 DCG 编写:
node(3, nil, 14).
node(14, nil, 15).
node(15, nil, 92).
node(92, nil, nil). % added!
inorder(I, Xs) :-
phrase(inorder(I), Xs).
inorder(nil) -->
[].
inorder(I) -->
{dif(I, nil)},
{node(I, L, R)},
inorder(L),
[I],
inorder(R).
| ?- inorder(3,L).
L = [3,14,15,92] ? ;
no
检查数据库中的孤立节点:
orphan(Nr) :-
node(_, L, R),
( Nr = L ; Nr = R ),
dif(Nr, nil),
\+ node(Nr, _, _).
所以 orphan(N)
应该在您的数据库上失败。
节点示例如下:
node(3, nil, 14).
node(14, nil, 15).
node(15, nil, 92).
我在这里看到过类似的问题,但是我的不同,因为我的节点在参数中有 3 个值而不是 2 个值。
示例 运行:
?- inOrder(3, X).
X = [3, 14, 15, 35, 65, 89, 92] .
我当前的代码是:
% the in-order traversal of a leaf is the leaf
inOrder(X, [X]) :-
node(X, nil, nil).
% if the node only has a left child, we traverse that
inOrder(x, [X|T]) :-
node(X, L, [X|T]),
inOrder(L, T).
% if the node only has a right child we traverse that
inOrder(x, [X|T]) :-
node(X, nil, R),
inOrder(R, T).
% if the node has both, we traverse them both.
inOrder(x, [X|T]) :-
node(L, X, R),
L \= nil, R \= nil,
inOrder(L, T1),
inOrder(R, T2),
append(T1, T, T2).
它 returns false 而不是实际值。
您在 inOrder
的递归案例中使用了小写字母 x
;那应该是一个变量。但这可能不是唯一的问题。
您的陈述有几处曲折。一般来说,树状结构在数据库中并没有被压平,这里用 node/3
,而是保持在一个词项中。
此外,坚持每个节点都有自己的事实似乎是个好主意。在您的示例中,92 需要一个事实!
所以考虑到所有这些预防措施,我们可以使用 DCG 编写:
node(3, nil, 14).
node(14, nil, 15).
node(15, nil, 92).
node(92, nil, nil). % added!
inorder(I, Xs) :-
phrase(inorder(I), Xs).
inorder(nil) -->
[].
inorder(I) -->
{dif(I, nil)},
{node(I, L, R)},
inorder(L),
[I],
inorder(R).
| ?- inorder(3,L).
L = [3,14,15,92] ? ;
no
检查数据库中的孤立节点:
orphan(Nr) :-
node(_, L, R),
( Nr = L ; Nr = R ),
dif(Nr, nil),
\+ node(Nr, _, _).
所以 orphan(N)
应该在您的数据库上失败。