二叉树inorder遍历使用Prolog

时间:2011-01-22 16:28:29

标签: prolog

我正在尝试实现一个inorder遍历,在每个阶段我都会获得当前节点。 例如:

?- 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

结果。那是为什么?

2 个答案:

答案 0 :(得分:3)

发生错误是因为您正在处理左右子树,但没有对其中的值执行任何操作:getnodesinorder(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.

答案 1 :(得分:1)

[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