sml中的二进制搜索

时间:2017-03-18 21:49:45

标签: binary-tree sml

datatype 'a tree= Leaf of 'a | Node of 'a tree * 'a * 'a tree

 fun binSearch (Node(left,n,right)) x =
    if x > n then false  
    else if x=n then true 
    else binSearch (Node(left,n,right)) x = binSearch (right) x andalso binSearch (left) x;

我很无奈。这段代码出了什么问题? BTW适用于:

binSearch (Node (Node (Leaf 1, 2, Leaf 3), 4, Leaf 7)) 7;

并不适用于:

binSearch (Node (Node (Leaf 1, 2, Leaf 3), 4, Leaf 7)) 2;

2 个答案:

答案 0 :(得分:1)

您对二叉树的定义并不理想,因为(例如)您无法构造具有两个元素的树。

是一种更灵活,更简单的定义
datatype 'a tree = Leaf | Node of 'a tree * 'a * 'a tree

其中Leaf是没有元素的树。这使您可以编写非常简单的基本案例:

fun binSearch t x =
  case t of
    Leaf => false
  | Node (left, n, right) => ...

对于Node案例,您可能会发现根据将期望值x与当前值n进行比较的三种可能性来构建代码很有帮助。

fun binSearch t x =
  case t of
    Leaf => false
  | Node (left, n, right) =>
      case Int.compare (x, n) of
        LESS => ...
      | EQUAL => true
      | GREATER => ...

我会把剩下的留给你。

答案 1 :(得分:0)

在第一个条件中,您说任何树中都不存在小于x的元素。

你忘了为空树写一个案例,这是唯一一个你知道是否找不到值的案例:

binSearch (Leaf n) x = n = x

此外,您的上次else

binSearch (Node(left,n,right)) x = binSearch (right) x andalso binSearch (left) x

binSearch (Node(left,n,right)) x是否给出与binSearch right x andalso binSearch left x相同结果的比较 也就是说,如果它在整个树两个子树中,或者在任何地方都找不到,那么它就会在树中找到x

递归应该

  • 如果x是节点中的值n,我们就找到了它。
    除此以外,
    • 如果x < n,请递归到左子树,
    • 如果x > n,则递归到正确的子树

实施作为练习。