在二进制树的道路 - Prolog

时间:2015-04-15 09:43:58

标签: prolog binary-tree

我的作业有问题。我必须在prolog中编写代码,这将向我展示最深的树叶。

树表示为:

tree([ [ [],r,[[],u,[[],t,[]]]  ], a ,  [ [], c, [] ]])

[]是[],如nil,a是根。

应该告诉我这样的事情:PATH = [a, r, u, t]

我将非常感激。

解决方案:

deepest(T,D) :- aggregate(max(L,P),(path(T,P),length(P,L)),max(_,D)).

path([],[]).
path([L,K,R],[K|P]) :- path(L,P) ; path(R,P).

测试:

?- tree(T),deepest(T,P).
T = [[[], r, [[], u, [[], t|...]]], a, [[], c, []]],
P = [a, r, u, t].

3 个答案:

答案 0 :(得分:1)

我知道,我们不应该做HW ...但是这个解决方案 - 原样 - 可能不适合你的班级。无论如何,希望它能帮助你解决Prolog中的这类问题。

deepest(T,D) :- aggregate(max(L,P),(path(T,P),length(P,L)),max(_,D)).

path([],[]).
path([L,K,R],[K|P]) :- path(L,P) ; path(R,P).

试验:

?- tree(T),deepest(T,P).
T = [[[], r, [[], u, [[], t|...]]], a, [[], c, []]],
P = [a, r, u, t].

注意:在掌握了这种语言的基础之后,通常不需要调试。解决方案足够陈述......

答案 1 :(得分:1)

由于这是一个家庭作业,我不会马上给你解决方案。

首先,让我们看一下你的树形结构。当您查看树时,您可以看到两个选项之一:它将是一个nil表示为[],或者它将是一个具有值和两个子树[LeftSubTree, Value, RightSubTree]的节点。因此,对于这两种情况,您的谓词应该有两个条款。

在这两种情况下,最深的路径是什么?好吧,对于零,答案很简单:没有节点,因此最长的路径实际上是一个空列表。

对于不是nil的树节点,最长的路径是什么样的?它将从当前节点中的值开始,并继续向左或向右子树,具体取决于哪个更深。因此,要从节点获得最深的路径,请在左右子树中递归计算最深的路径,从中获取较长的路径并从前面的当前节点获取值。

要以这种方式实现它,您会发现使用帮助器谓词longer(List1, List2, LongerList)非常方便,它会将List1List2的较长时间放入LongerList。< / p>

答案 2 :(得分:1)

这是一个纯变体,不需要像aggregate/3那样的所有解决方案元谓词。

首先,这是你的样本树:

sampleTree([[[],r,[[],u,[[],t,[]]]],a,[[],c,[]]]).

接下来,is_tree/1定义树的外观:

is_tree([]).
is_tree([Left,_,Right]) :-
   is_tree(Left),
   is_tree(Right).

最后,我们定义tree_leftmostLongestPath/2用于pre-order tree traversal

is_tree/1相比,tree_leftmostLongestPath_/4还有3个参数:

  • RPath这是迄今为止颠倒顺序
  • 的路径
  • Best0是一对Len-Path并保留了迄今为止找到的最长路径
  • Best也是一对Len-Path并且拥有整个树/子树的最长路径

以下是代码:

:- use_module(library(clpfd)).

tree_leftmostLongestPath(Tree, Path) :-
   tree_leftmostLongestPath_(Tree, [], 0-[], _-Path).

% "internal" auxiliary predicate
tree_leftmostLongestPath_([], RPath, Best0, Best) :-
   Best0 = L0-_,
   length(RPath, Len),
   (  Len #=< L0,                       Best = Best0
   ;  Len #>  L0, reverse(RPath, Path), Best = Len-Path
   ).
tree_leftmostLongestPath_([Left,Name,Right], RPath, Best0, Best) :-
   RPath1 = [Name|RPath],
   tree_leftmostLongestPath_(Left , RPath1, Best0, Best1),
   tree_leftmostLongestPath_(Right, RPath1, Best1, Best).

一些疑问和答案:

?- sampleTree(Tree), tree_leftmostLongestPath(Tree, Path).
Path = [a,r,u,t], Tree = [[[],r,[[],u,[[],t,[]]]],a,[[],c,[]]]).

?- is_tree(Tree), tree_leftmostLongestPath(Tree, Path).
   Path = []     , Tree = []
;  Path = [A]    , Tree = [[],A,[]]
;  Path = [A,B]  , Tree = [[],A,[[],B,[]]]
;  Path = [A,B,C], Tree = [[],A,[[],B,[[],C,[]]]]
…