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;
答案 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
,则递归到正确的子树实施作为练习。