该函数的目标是在树的最左侧节点中找到并返回值:
type btree = Empty | Node of btree * int * btree
type finding = NotFound | Found of int
let s = Node (Node(Empty, 5, Empty), 3, Node (Empty, 6, Empty))
(*
(3)
/ \
(5) (6)
/ \ / \
() () () ()
*)
let rec leftmost t =
match t with
Node (t, _, _) -> leftmost t
| _ -> failwith "Empty"
let n = leftmost s
printfn "Found %i" n
这是我目前拥有代码的方式。每次都确实遇到空树错误。我是F#的新手,当我找到最左边的节点时,很难弄清楚如何实现这种情况。 我最初的想法是
| (Empty, t, _) -> t
但是我发现没有成功,我们将不胜感激。谢谢。
答案 0 :(得分:3)
您快到了。 | (Empty, )
卫队的想法很好。如果应用在正确的位置,它将起作用:
let rec leftmost t =
match t with
Node(Empty, n, _) -> n
| Node (t, _, _) -> leftmost t
| _ -> failwith "Empty"
重要的是,一旦下一个左子节点为t
,我们需要在当前节点n
处停止并返回其有效载荷Empty
。
为完整起见:建议命名左子树的名称与当前根的名称不同,并对齐大小写:
let rec leftmost t =
match t with
| Node(Empty, n, _) -> n
| Node (l, _, _) -> leftmost l
| _ -> failwith "Empty"
此外,let f x = match x with | P
还有一个快捷方式:let f = function | P
,它减轻了为参数命名的麻烦:
let rec leftmost = function
| Node(Empty, n, _) -> n
| Node (l, _, _) -> leftmost l
| _ -> failwith "Empty"