[英]Assistance working with Binary Trees in SML
我是 SML 的新手,希望在使用以下二叉树实现方面获得一些帮助。
datatype tree = NODE of int * tree * tree | LEAF of int;
我看到树是由具有两个子树的节点或具有 integer 的 LEAF 定义的。
如何访问子树以便确定最大值、最小值以及元素是否存在于树中?
访问左右子树的过程是什么?
访问左右子树的过程是什么?
您使用模式匹配:
fun goLeft (NODE (_, l, _)) = l
| goLeft LEAF = raise Fail "Cannot go left here!"
fun goRight (NODE (_, _, r)) = r
| goRight LEAF = raise Fail "Cannot go right here!"
我如何[...]确定最大值、最小值以及元素是否存在于树中?
您构建在子树上进行模式匹配的递归函数。
例如,二叉树中没有不变量表示最小元素在树中具有固定的已知位置。 但是这个不变量存在于二叉搜索树中,其中每个左子树(包括根)中的所有元素都确保小于或等于其右子树的所有元素。
那个树
5
/ \
3 8
/ / \
2 7 9
有资格作为二叉搜索树,因为这个不变量成立。
在这样的树中找到最小元素意味着以这样一种方式递归,即你总是选择左子树,直到没有左子树,在这种情况下你找到了最小值。 你怎么知道什么时候停止递归?
fun goLeeeft (NODE (_, l, _)) = goLeeeft l
| goLeeeft LEAF = "I've gone all the way left, but I have nothing to show for it."
fun minimum (NODE (x, l, r)) = (* is this the last non-leaf node? *)
| minimum LEAF = raise Empty (* whoops, we recursed too far! *)
当您模式匹配一个深度级别时,即在NODE (x, l, r)
上,您只知道这是一个非叶节点,但您不知道位于节点x
中的确切值,并且你对这个节点的左右子树的子结构一无所知。
你可以在这里用两种方法 go :要么制作一个帮助器 function 告诉你何时停止递归,要么模式匹配更深一层l
。 这里有两个例子; 他们执行相同的操作:
(* Using a helper function *)
fun isLeaf (NODE (_, _, _)) = false
| isLeaf LEAF = true
fun minimum (NODE (x, l, _)) =
if isLeaf l
then x
else minimum l
| minimum LEAF = raise Empty
(* Using direct pattern matching *)
fun minimum (NODE (x, LEAF, _)) = x
| minimum (NODE (x, l, _)) = minimum l
| minimum LEAF = raise Empty
现在maximum
写自己。
出于好奇,您可以定义通用递归方案,例如在树上折叠:Sml fold a tree
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.