Tree 标准ml从列表中生成bst
我想制作一个函数标准ml,它接受一个列表和函数,并从中生成一个BST。函数的类型是:Tree 标准ml从列表中生成bst,tree,sml,binary-search-tree,currying,ml,Tree,Sml,Binary Search Tree,Currying,Ml,我想制作一个函数标准ml,它接受一个列表和函数,并从中生成一个BST。函数的类型是:'a list->('a*'a->bool)->'a tree,但我遇到了一些问题,下面是我编写的代码: datatype 'data tree = EMPTY | NODE of 'data tree * 'data * "data tree; fun makeBST [] f = EMPTY | makeBST (x::xs) f = let fun insert EM
'a list->('a*'a->bool)->'a tree
,但我遇到了一些问题,下面是我编写的代码:
datatype 'data tree =
EMPTY
| NODE of 'data tree * 'data * "data tree;
fun makeBST [] f = EMPTY
| makeBST (x::xs) f =
let
fun insert EMPTY x = NODE(EMPTY, x, EMPTY)
| insert (NODE(left, root, right)) x =
if f(x, root) then
insert left x
else
insert right x
in
makeBST xs f
end;
这个函数的类型是:
'a list->('b*'c->bool)->'d tree
当我尝试调用它时,就像下面的makeBST[4,3,6,7,8,2,0,1](op代码的第一个版本有两个问题:
- 您在let块中声明了一个从未使用过的函数,并且您的函数递归地调用自己,直到第一个参数为空列表,因此您的代码可以简化为
fun makeBST\uu=empty
,因此这可能是您收到错误的原因,因为SML不知道empty
是什么类型应该是
- 第3行的双引号应为单引号
尽管如此,由于您已经制作了第二个版本,我猜您已经捕捉到了这一点。但是,您的新代码仍然不正确。对该函数的任何调用的结果都是一个树,其中列表的第一个元素是根,两个空
子元素。您正在比较左子树和右子树,然后在右侧添加新值但问题是您只返回该子树,而不是整个树。您需要的是以下内容:
fun makeBST [] f = EMPTY
| makeBST (x::xs) f =
let
val tree = EMPTY
fun insert EMPTY x = NODE (EMPTY, x, EMPTY)
| insert (NODE(left, root, right)) x =
if f(x, root) then
Node(insert left x, root, right)
else
Node(left, root, insert right x)
in
insert (makeBST xs f) x
end;
您需要行val tree=EMPTY
?这当然是韦伯现代编程语言第11章练习11中的教科书作业问题。
fun makeBST [] f = EMPTY
| makeBST (x::xs) f =
let
val tree = EMPTY
fun insert EMPTY x = NODE (EMPTY, x, EMPTY)
| insert (NODE(left, root, right)) x =
if f(x, root) then
insert left x
else
insert right x
in
insert (makeBST xs f) x
end;
fun makeBST [] f = EMPTY
| makeBST (x::xs) f =
let
val tree = EMPTY
fun insert EMPTY x = NODE (EMPTY, x, EMPTY)
| insert (NODE(left, root, right)) x =
if f(x, root) then
Node(insert left x, root, right)
else
Node(left, root, insert right x)
in
insert (makeBST xs f) x
end;