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;
答案 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
上调用助手,但这肯定是可行的。