基于Prolog的二叉树有序遍历

基于Prolog的二叉树有序遍历,prolog,Prolog,我试图实现一个按序遍历,在每个阶段我都会得到当前节点。 例如: ?- getnodesinorder(tree(1,nil,nil),X). X = 1 ; false. ?- getnodesinorder(tree(5,tree(4,tree(1,nil,tree(3,tree(2,nil,nil),nil)),nil),tree(6,nil,nil)),X). X = 1 ; X = 2 ; X = 3 ; X = 4 ; X = 5 ; X = 6 ; false. 我尝试了下一个

我试图实现一个按序遍历,在每个阶段我都会得到当前节点。 例如:

?- getnodesinorder(tree(1,nil,nil),X).
X = 1 ;
false.

?- getnodesinorder(tree(5,tree(4,tree(1,nil,tree(3,tree(2,nil,nil),nil)),nil),tree(6,nil,nil)),X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = 6 ;
false. 
我尝试了下一个代码:

getnodesinorder(tree(CurrentNode,nil,nil), CurrentNode).
getnodesinorder(tree(X, Left, nil), CurrentNode) :-
    getnodesinorder(Left, _ ),
    CurrentNode is X.
getnodesinorder(tree(X, nil, Right), CurrentNode) :-
    CurrentNode is X,
    getnodesinorder(Right, _ ).
getnodesinorder(tree(X, Left, Right), CurrentNode) :-
    getnodesinorder(Left, _ ),
    CurrentNode is X,
    getnodesinorder(Right, _ ).
因此,当然基础(第一个示例有效),但当尝试运行第二个示例时,我得到

X=5;
false
结果呢。为什么呢

[test] λ = cat test.pl 
append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).

getnodesinorder(nil, []).

getnodesinorder(tree(X, Left, Right), R) :-
   getnodesinorder(Left,R1),
   getnodesinorder(Right,R2),
   append(R1,[X|R2],R).
为我工作

?-getnodesinorder(tree(5,tree(4,tree(1,nil,tree(3,tree(2,nil,nil),nil)),nil),tree(6,nil,nil)),X).
X = [1,2,3,4,5,6] ? 
yes
为我工作

?-getnodesinorder(tree(5,tree(4,tree(1,nil,tree(3,tree(2,nil,nil),nil)),nil),tree(6,nil,nil)),X).
X = [1,2,3,4,5,6] ? 
yes

发生此错误的原因是您正在处理左、右子树,但没有对其中的值执行任何操作:
getNodesNorder(left,)
将其丢弃。因此,谓词只返回顶部元素

以下是如何进行顺序遍历:

inorder(tree(_,L,_), X) :- inorder(L,X).
inorder(tree(X,_,_), X).
inorder(tree(_,_,R), X) :- inorder(R,X).
查询示例:

?- inorder(tree(5,tree(4,tree(1,nil,tree(3,tree(2,nil,nil),nil)),nil),tree(6,nil,nil)),X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = 6 ;
false.

发生此错误的原因是您正在处理左、右子树,但没有对其中的值执行任何操作:
getNodesNorder(left,)
将其丢弃。因此,谓词只返回顶部元素

以下是如何进行顺序遍历:

inorder(tree(_,L,_), X) :- inorder(L,X).
inorder(tree(X,_,_), X).
inorder(tree(_,_,R), X) :- inorder(R,X).
查询示例:

?- inorder(tree(5,tree(4,tree(1,nil,tree(3,tree(2,nil,nil),nil)),nil),tree(6,nil,nil)),X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = 6 ;
false.

好的,这样做了(见上面编辑的),但现在我只得到X=5,然后由于某种原因得到false。试试我的示例。始终记住使用跟踪。是的,但您使用了列表。在您的代码中,X是一个您构建的列表,最后是一个按序遍历的列表。我想要别的东西。我希望X是一个能得到所有正确值的变量。就像在这个例子中,当我输入“;”时,我想得到下一个X(顺序序列的下一个数字)。好的,这样做了(见上面编辑的),但现在我只得到X=5,然后由于某种原因得到false。试试我的示例。始终记住使用跟踪。是的,但您使用了列表。在您的代码中,X是一个您构建的列表,最后是一个按序遍历的列表。我想要别的东西。我希望X是一个能得到所有正确值的变量。就像在示例中一样,当我键入“;”时,我希望得到下一个X(顺序序列的下一个数字)。