在F#中找到树中最左边的节点

时间:2018-09-06 15:35:03

标签: f# binary-tree

该函数的目标是在树的最左侧节点中找到并返回值:

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

但是我发现没有成功,我们将不胜感激。谢谢。

1 个答案:

答案 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"