我正在开发一个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)
我希望在输出中得到一个二叉搜索树,不知道我做错了什么。任何帮助将不胜感激。
答案 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
等)。