簡體   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