Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
prolog-查找二叉树的最大和子树_Prolog - Fatal编程技术网

prolog-查找二叉树的最大和子树

prolog-查找二叉树的最大和子树,prolog,Prolog,如何在Prolog中找到二叉树的maxsum子树 假设这是一棵树: t(t(t(nil,-5,nil),4,t(t(nil,15,nil),-20,t(nil,10,nil))),2,t(nil,-8,t(t(nil,9,nil),12,t(nil,10,nil)))) 此树的最大和子树是右下树: t(t(nil,9,nil),12,t(nil,10,nil)) 我怎样才能在序言中找到它呢?mmmmhh。。。 我不知道“最大和子树”是什么意思,但是。。。希望这有帮助 maxSubTree(n

如何在Prolog中找到二叉树的maxsum子树

假设这是一棵树:

t(t(t(nil,-5,nil),4,t(t(nil,15,nil),-20,t(nil,10,nil))),2,t(nil,-8,t(t(nil,9,nil),12,t(nil,10,nil))))
此树的最大子树是右下树:

t(t(nil,9,nil),12,t(nil,10,nil))
我怎样才能在序言中找到它呢?

mmmmhh。。。 我不知道“最大和子树”是什么意思,但是。。。希望这有帮助

maxSubTree(nil, 0, 0, nil).

maxSubTree(t(T1, V0, T2), Sum, Sum, t(T1, V0, T2)) :-
  maxSubTree(T1, Sum1, MaxSum1, _),
  maxSubTree(T2, Sum2, MaxSum2, _),
  Sum is Sum1 + Sum2 + V0,
  Sum >= MaxSum1,
  Sum >= MaxSum2.

maxSubTree(t(T1, V0, T2), Sum, MaxSum1, MaxTree1) :-
  maxSubTree(T1, Sum1, MaxSum1, MaxTree1),
  maxSubTree(T2, Sum2, MaxSum2, _),
  Sum is Sum1 + Sum2 + V0,
  MaxSum1 >= Sum,
  MaxSum1 >= MaxSum2.

maxSubTree(t(T1, V0, T2), Sum, MaxSum2, MaxTree2) :-
  maxSubTree(T1, Sum1, MaxSum1, _),
  maxSubTree(T2, Sum2, MaxSum2, MaxTree2),
  Sum is Sum1 + Sum2 + V0,
  MaxSum2 >= Sum,
  MaxSum2 >= MaxSum1.

我获得(变量
MT

你可以这样写:

 max_sub_tree(Tree,T,N):-
    sol_tree_noroot(Tree,T1,N1),
    sol_tree_withroot(Tree,T2,N2),!,
    max_set(T1,N1,T2,N2,T,N).

max_set(T1, N1, T2, N2, T, N) :-
    (N1>N2,T=T1,N=N1;
     N2>N1,T=T2,N=N2;
    N2=:=N1,N=N1,(T=T1;T=T2)).    

sol_tree_noroot(nil,nil,0).
sol_tree_noroot(t(L,_,R),T,N):-
      max_sub_tree(L,T1,N1),max_sub_tree(R,T2,N2),!,
      max_set(T1, N1, T2, N2, T, N).

sol_tree_withroot(nil,nil,0).
sol_tree_withroot(t(L,X,R),t(L1,X,R1),N3):-
     sol_tree_withroot(L,T1,N1),sol_tree_withroot(R,T2,N2),
     max_set2(T1,N1,T2,N2,L1,R1,N),
     N3 is N+X.

max_set2(T1,N1,T2,N2,L,R,N):-
    (N1>0,N2>0,N is N1+N2,L=T1,R=T2;
     N1>=0,N2<0,N is N1 ,R=nil,L=T1;
     N1<0,N2>=0,N is N2 ,L=nil,R=T2;
     N1<0,N2<0,N1<N2,N is N2 ,L=nil,R=T2;
     N1<0,N2<0,N1>N2,N is N1 ,L=T1,R=nil;
     N1>0,N2=0,N is N1,(L=T1,R=nil;L=T1,R=T2);
     N1=0,N2>0,N is N2,(R=T2,L=nil;L=T1,R=T2);
     N1=0,N2=0,N is N1,(L=T1,R=nil;R=T2,L=T1;L=T1,R=T2)). 
它返回:

T = t(t(nil, 4, t(t(nil, 15, nil), -20, t(nil, 10, nil))), 2, t(nil, -8, t(t(nil, 9, nil), 12, t(nil, 10, nil)))),
N = 34 ;

其中T是给定树中的最大子树,它有34个节点(而不是像示例中的31个节点)。

您可以从编写一些prolog开始尝试解决该问题。通过定义如何确定哪个子树最大。@ScottHunter我希望我知道如何开始编写这个问题的解决方案。正如我所写的,最大和子树,我怎样才能更好地解释它呢?它的节点之和大于树中所有其他子树的子树您提到max sub tree 3次,仅一次添加sum一词。如果你不知道如何写序言,你应该从学习语言开始。我不认为你例子中的子树是最大的,因为它有和:31但是t(t(nil,4,t(t(nil,15,nil),-20,t(nil,10,nil))),2,t(nil,-8,t(t(nil,9,nil),12,t(nil,10,nil)))有和34,它更大,显然是一个子树。抱歉,但是
max_sub_tree/3
在最后一个示例中是前面代码中的
sol_tree/3
吗?@max66,你完全正确,我在最后一分钟更改了名称以更具描述性,但忘了进一步更改,我编辑了我的答案,谢谢@你可以把他和我几天的线索联系起来back@infested,这有点不同,因为它被要求返回一棵树而不是一个列表,所以我需要在实现中更改一些内容,但主要思想是相同的。@编码器,对问题进行不同解释的好主意,但结果子树必须是原始树的子树。这意味着您不能仅仅因为节点减少了结果就跳过节点。这就是为什么答案是31,因为9-12-10的子树是原始树的真正子树。
 max_sub_tree(Tree,T,N):-
    sol_tree_noroot(Tree,T1,N1),
    sol_tree_withroot(Tree,T2,N2),!,
    max_set(T1,N1,T2,N2,T,N).

max_set(T1, N1, T2, N2, T, N) :-
    (N1>N2,T=T1,N=N1;
     N2>N1,T=T2,N=N2;
    N2=:=N1,N=N1,(T=T1;T=T2)).    

sol_tree_noroot(nil,nil,0).
sol_tree_noroot(t(L,_,R),T,N):-
      max_sub_tree(L,T1,N1),max_sub_tree(R,T2,N2),!,
      max_set(T1, N1, T2, N2, T, N).

sol_tree_withroot(nil,nil,0).
sol_tree_withroot(t(L,X,R),t(L1,X,R1),N3):-
     sol_tree_withroot(L,T1,N1),sol_tree_withroot(R,T2,N2),
     max_set2(T1,N1,T2,N2,L1,R1,N),
     N3 is N+X.

max_set2(T1,N1,T2,N2,L,R,N):-
    (N1>0,N2>0,N is N1+N2,L=T1,R=T2;
     N1>=0,N2<0,N is N1 ,R=nil,L=T1;
     N1<0,N2>=0,N is N2 ,L=nil,R=T2;
     N1<0,N2<0,N1<N2,N is N2 ,L=nil,R=T2;
     N1<0,N2<0,N1>N2,N is N1 ,L=T1,R=nil;
     N1>0,N2=0,N is N1,(L=T1,R=nil;L=T1,R=T2);
     N1=0,N2>0,N is N2,(R=T2,L=nil;L=T1,R=T2);
     N1=0,N2=0,N is N1,(L=T1,R=nil;R=T2,L=T1;L=T1,R=T2)). 
max_sub_tree(t(t(t(nil, -5, nil), 4, t(t(nil, 15, nil), -20, t(nil, 10, nil))), 2, t(nil, -8, t(t(nil, 9, nil),12,t(nil, 10, nil)))),T,N).
T = t(t(nil, 4, t(t(nil, 15, nil), -20, t(nil, 10, nil))), 2, t(nil, -8, t(t(nil, 9, nil), 12, t(nil, 10, nil)))),
N = 34 ;