【问题标题】:Merge two binary search trees together in Prolog在 Prolog 中将两个二叉搜索树合并在一起
【发布时间】:2023-12-30 01:41:01
【问题描述】:

我正在开发一个 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)

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

【问题讨论】:

  • 您有一些不使用变量的情况。例如,在您的第二条规则中,变量ROOT 应该用于什么?
  • ROOT是用来存放树顶的
  • 我猜您在尝试编译此代码时会收到警告。不要忽视它们:如果你弄清楚为什么会收到警告,以及如何避免它们,你可能会自己解决问题。

标签: prolog binary-search-tree


【解决方案1】:

从小处着手。从你已经知道的开始:

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 &gt; B 等)。

【讨论】:

    最近更新 更多