Function 在SML中协助使用二叉树

Function 在SML中协助使用二叉树,function,functional-programming,binary-tree,sml,smlnj,Function,Functional Programming,Binary Tree,Sml,Smlnj,我是SML新手,希望在使用二叉树的以下实现方面得到一些帮助 datatype tree=int的节点*tree*tree | int的叶子; 我看到树是由具有两个子树的节点或具有整数的叶定义的 如何访问子树,以便确定最大值、最小值以及元素是否存在于树中 访问左、右子树的过程是什么 访问左、右子树的过程是什么 您可以使用模式匹配: fun-goLeft(节点(u,l,u))=l |goLeft LEAF=升起失败“此处不能向左!” fun goRight(节点(,,r))=r |goRight

我是SML新手,希望在使用二叉树的以下实现方面得到一些帮助

datatype tree=int的节点*tree*tree | int的叶子;
我看到树是由具有两个子树的节点或具有整数的叶定义的

如何访问子树,以便确定最大值、最小值以及元素是否存在于树中

访问左、右子树的过程是什么

访问左、右子树的过程是什么

您可以使用模式匹配:

fun-goLeft(节点(u,l,u))=l
|goLeft LEAF=升起失败“此处不能向左!”
fun goRight(节点(,,r))=r
|goRight LEAF=提升失败“不能在这里进行!”
如何[…]确定最大值、最小值以及元素是否存在于树中

您可以构建子树上模式匹配的递归函数

例如,二叉树中没有表示最小元素在树中有固定的已知位置的不变量。但这种不变量存在于二叉搜索树中,其中每个左子树(包括根)中的所有元素都确保小于或等于其右子树中的所有元素

    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! *)
当模式匹配一级深度时,即在
节点(x,l,r)
上,您只知道这是一个非叶节点,但不知道位于节点
x
中的确切值,也不知道该节点的左、右子树的子结构

这里有两种方法:要么生成一个helper函数,告诉您何时停止递归,要么将模式匹配到
l
的更深一层。这里有两个例子;它们执行相同的操作:

(*使用辅助函数*)
fun isLeaf(节点(,,,))=false
|isLeaf叶=真
乐趣最小值(节点(x,l,_))=
if isLeaf l
然后x
其他最低要求
|最小叶=升起空
(*使用直接模式匹配*)
最小值(节点(x,叶,))=x
|最小值(节点(x,l,))=最小值l
|最小叶=升起空
现在
maximum
自动写入

出于好奇,您可以定义通用递归方案,例如在树上折叠:

访问左、右子树的过程是什么

您可以使用模式匹配:

fun-goLeft(节点(u,l,u))=l
|goLeft LEAF=升起失败“此处不能向左!”
fun goRight(节点(,,r))=r
|goRight LEAF=提升失败“不能在这里进行!”
如何[…]确定最大值、最小值以及元素是否存在于树中

您可以构建子树上模式匹配的递归函数

例如,二叉树中没有表示最小元素在树中有固定的已知位置的不变量。但这种不变量存在于二叉搜索树中,其中每个左子树(包括根)中的所有元素都确保小于或等于其右子树中的所有元素

    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! *)
当模式匹配一级深度时,即在
节点(x,l,r)
上,您只知道这是一个非叶节点,但不知道位于节点
x
中的确切值,也不知道该节点的左、右子树的子结构

这里有两种方法:要么生成一个helper函数,告诉您何时停止递归,要么将模式匹配到
l
的更深一层。这里有两个例子;它们执行相同的操作:

(*使用辅助函数*)
fun isLeaf(节点(,,,))=false
|isLeaf叶=真
乐趣最小值(节点(x,l,_))=
if isLeaf l
然后x
其他最低要求
|最小叶=升起空
(*使用直接模式匹配*)
最小值(节点(x,叶,))=x
|最小值(节点(x,l,))=最小值l
|最小叶=升起空
现在
maximum
自动写入


出于好奇,您可以定义通用的递归方案,例如在树上折叠:

阅读您正在学习的任何材料中的模式匹配和递归。它通常比二叉树要早一点介绍。阅读任何你正在学习的材料中的模式匹配和递归。它通常比二叉树早一点被覆盖。