在Prolog中合并两个二叉搜索树

时间:2016-03-06 15:26:17

标签: prolog binary-search-tree

我正在开发一个SWI-Prolog程序,我将两个二叉搜索树合并在一起,但我得到了错误的输出。 BST T2是将BST T1中的每个节点插入BST T的结果。

 merge(T,T1,T2).

我现在的代码:

 add_BST(T , T1 , T2).
 add_BST(t(L , T1 , R ) , t(L , T2 , R), t(t(L , ROOT , RIGHT ) , T1 , NT)) :- 
     T1 < T2 , add_BST(T2 , T1  , NT).
 add_BST(t( L , T1 , R) , t(L , T2 , R), t(NT1 , T1 ,t( LEFT , ROOT ,R ))) :- 
     T1 > T2 , add_BST(T2 , T1  ,NT1).

此输出:

?- add_BST(t(nil , 1 , nil) , t(nil , 2 , nil) , NT).

true;

NT=t(t(nil,_G1601, _G1602),1,_G1598)

我希望在输出中得到一个二叉搜索树,不知道我做错了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

从小处开始。从您已经知道的内容开始:

add_BST( t(nil , 1 , nil) , t(nil , 2 , nil) , NT) :-

这是一段非常有效的代码,是谓词的头部,用于处理t(nil , 1 , nil)t(nil , 2 , nil)的合并。我们对这种情况了解多少?

    1 < 2, 

其结果显然应该是

    NT = t( t(nil , 1 , nil) , 2, nil ).

试一试:

?- add_BST( t(nil , 1 , nil) , t(nil , 2 , nil) , NT).

,或者

?- A=1, B=2, add_BST( t(nil , A , nil) , t(nil , B , nil) , NT).

这个希望能给我们一个重写它​​的想法

add_BST( t(nil , A , nil) , t(nil , B , nil) , NT) :-
    A < B, 
    NT = t( t(nil , A , nil) , B, nil ).

您应该能够从这里进一步概括它,并涵盖更多可能的情况(例如,A > B等)。