如何在标准ML中编写BST搜索功能?

时间:2012-04-01 17:58:39

标签: sml

所需要的是编写''a tree -> (''a * ''a -> bool) -> ''a -> bool类型的函数searchBST 搜索给定数据元素的nst。使用:

datatype 'data tree = Empty 
                    | Node of 'data tree * 'data * 'data tree

此外,我们无法搜索树中的每个节点,只能搜索那些根据定义可能包含我们要查找的元素的节点。

我写的函数是(int * int tree -> bool)类型,我很感激将其转换为所需类型的任何提示

datatype 'data tree = Empty 
                    | Node of 'data tree * 'data * 'data tree;

fun searchBST (x, Empty) = false
  | searchBST (x, Node(l, parent, r)) =
      if x = parent then true 
      else 
       if x< parent then searchBST(x, l)
       else searchBST(x,r)

2 个答案:

答案 0 :(得分:2)

当某些内容具有''a * ''a -> bool类型时,它始终是(99.9%的时间)谓词函数。由于参数元组''a * ''a是一个相等类型(因此是双重标记,而不是单个标记为“正常”)这一事实强烈暗示了这一点。

由于您正在构建搜索功能,因此您的谓词函数很可能是应该用于定义要搜索的元素的函数。 然而,也可能是它定义所需元素是否在树的左侧或右侧部分的情况。虽然通常它会是类型为''a * ''a -> order的排序函数。这样的排序函数在任何实际情况下都会更好,因为你可以抽象出元素的排序(包括相等)而不是硬编码小于,这会强制你的函数只对整数有效(除非您键入注释到其他数字类型(如实数)而不是''a(相等)值。

因此,你想要的(获得所需的类型)是这样的形式:

fun searchBST t p x = 

其中t是树,p是您的谓词函数,x是您不想找到的值。基本上你缺少的是在测试中使用谓词函数,而不是直接使用它。

fun searchBST Empty _ _ = false
  | searchBST (Node(l, d, r)) p x = 
     case (p(x, d), x < d) of
        (true, _) => true
      | (_, true) => searchBST l p x
      | (_, false) => searchBST r p x

答案 1 :(得分:1)

您的代码中缺少此部分“(''*''a - &gt; bool)”考虑到它,处理元组然后您的代码将起作用。两个''是你搜索的元素和节点中的元素。