SML - 检查树数据类型是否有效的函数

时间:2015-10-23 10:57:58

标签: validation types tree sml

datatype tree = br of tree*int*tree | lf

如果左侧分支的值始终低于根,而右侧的分支始终更高,则树有效。 例如:

valid(br(br(lf,2,lf),1,lf)) = false;
valid(br (br (lf, 2, br (lf, 7, lf)), 8, lf)) = true;

我正在寻找像这样的东西,除了我不知道如何将内部分支的整数与根的整数进行比较。

fun valid(lf)=true 
  | valid(br(left,x,right)) = valid(left) andalso valid(right);

编辑: 到目前为止,我已经提出了这个问题(但是它仍然没有检查所有上部节点的所有整数,只有1个节点在上面......它很近但没有雪茄)

fun valid(lf)=true 
| valid(br(lf,x,lf)) = true
| valid(br(lf,x,br(left2,z,right2))) = if x<z then valid(br(left2,z,right2)) else false
| valid(br(br(left,y,right),x,lf)) = if y<x then valid(br(left,y,right)) else false
| valid(br(br(left,y,right),x,br(left2,z,right2))) = if y<x andalso x<z then valid(br(left,y,right)) andalso valid(br(left2,z,right2)) else false;

1 个答案:

答案 0 :(得分:1)

假设这是作业,我会给你一个提示,而不是一个完整的答案。首先定义一个函数会有所帮助,可以称之为all_nodes,其类型为

tree * (int -> bool) -> bool

这应该是一个函数,当传递树和布尔函数时,如果树中的所有整数都满足谓词,那么整数返回true

然后你的函数valid应该有4个(而不是2个)子句。要使br(left,x,right)有效:

1)左必须有效

2)左边的所有整数节点都必须满足它们&lt; X 。这可以使用all_nodes和适当的匿名函数

进行检查

3)权利必须有效

4)右边的所有整数节点必须> x,再次可以通过将适当的匿名函数传递给all_nodes

来检查

On Edit:上面的方法可行,但由于对每个子树应用了两个而不是一个递归函数,因此会产生一定的低效率。另一种方法是定义一个辅助函数,它只适用于br(left,x,right)形式的树。这个辅助函数可以返回一个类型为bool*int*int的元组,它告诉你树是否有效,以及树中的最小和最大int。 main函数将简单地处理lf模式并调用和解释辅助函数。关键的一点是,在密钥递归步骤中,足以检查节点左边的最大值和右边的最小值。需要注意如何制定递归步骤,以便不在lf上调用助手,但这肯定是可行的。