繁体   English   中英

协助在 SML 中使用二叉树

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM