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