【问题标题】:Prolog. Nodes of a Binary Tree序言。二叉树的节点
【发布时间】:2017-05-28 20:22:27
【问题描述】:

我是使用 Prolog 的新手,希望您能帮助我。

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

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

并且有这种形式

好的。这听起来很简单,但我只需要使用这些构造函数和选择器来制作谓词:

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).

有什么办法可以解决这个问题吗?

谢谢!

【问题讨论】:

  • 什么是raiz/2
  • 但是列表中节点的顺序是什么,为什么使用这种奇怪的嵌套列表树而不是普通的tree/3树?

标签: tree prolog


【解决方案1】:

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

想想一般情况下节点列表的规则是什么:

一棵树的节点列表[Left, Node, Right] 将是Left 的节点列表、Node 的节点列表以及Right 的节点列表。

所以你的谓词应该在某种程度上类似于这条规则。

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

剩下的留作练习。

【讨论】:

  • 谢谢!真的很有用:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 2012-04-15
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多