序言。二叉树的节点

时间:2017-05-28 20:22:28

标签: tree prolog

我是新人使用Prolog,我希望你能帮助我。

我需要使用名为listofnodes(A4,L)的谓词来获取二叉树中的所有节点。树A4就是这样的:

[[[[[],1,[]],5,[]],
7,
[[],3,[[],4,[]]]],
6,
[[[],10,[]],
8,
[[[],9,[]],11,[[],2,[]]]]]

并且有这种形式

enter image description here

确定。这听起来很容易,但我只需要使用这些构造函数和选择器来创建谓词:

empty([]).
root([_,N,_], N). %root node
hi([HI,_,_],HI).  %left child
hd([_,_,HD],HD).  %right child
dotree(R,HI,HD,[HI,R,HD]). %make a tree

所以我认为我可以使用下一个代码执行此操作,但错误

childs(X,[L,X,R],[L,X,R]).
childs(X,[L,_,_],D) :- childs(X,L,D).
childs(X,[_,_,R],D) :- childs(X,R,D).

listofnodes([],[]).
listofnodes([[],X,[]],[X]).
listofnodes(Abn,P) :- raiz(Abn, N), childs(N,Abn,D), listofnodes(D,P).

任何想法如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您正确定义递归案例,则可能不需要listofnodes([[],X,[]],[X]).。您已经listofnodes([], []).正确定义了空树的节点列表。

考虑一般情况下节点列表的规则:

  

树的节点列表[Left, Node, Right]将是Left的节点列表,节点Node以及Right的节点列表。< / p>

所以你的谓词应该以某种方式类似于这个规则。

listofnodes([Left, Node, Right], ListOfNodes) :-
    listofnodes(Left, LeftNodes),
    ...

我将剩下的作为练习。