如何获得最小深度的叶子?

时间:2012-12-08 13:29:27

标签: f#

例如,我有一个具有这种结构的树

let tr = Node(1,[Node(2,[Leaf(5)]);Node(3,[Leaf(6);Leaf(7)]);Leaf(4)])

如何获得最小深度的叶子?

2 个答案:

答案 0 :(得分:7)

解决此问题的一种方法是实现Breadth-First Search算法。算法在“级别”中遍历树,因此它返回根,然后是根的所有子项,然后是这些子项的所有子项,依此类推。您可以将其写为F#函数返回序列:

/// Breadth-first search over a tree 
/// Takes list of initial nodes as argument
let rec breadthFirstSearch nodes = seq {
  // Return all nodes at the current level
  yield! nodes
  // Collect all children of current level
  let children = nodes |> List.collect (function
    | Leaf _ -> [] | Node(_, c) -> c)
  // Walk over all the children (next level)
  if children <> [] then
    yield! breadthFirstSearch children }

这对于各种树处理任务来说是非常有用的算法,所以拥有它是很有用的。现在,要获得最低Leaf,您可以选择序列中的第一个Leaf节点:

breadthFirstSearch [tr]
|> Seq.filter (function Leaf _ -> true | _ -> false)
|> Seq.head

我认为这个解决方案很好,因为它实现了一个更有用的功能,然后只用它来解决你在三行上的特定问题。

答案 1 :(得分:3)

let minDepthLeaf tree = 
    let rec aux (depth: int) = function
    | Leaf(_) as l -> (l, depth)
    | Node(_, children) -> children |> List.map (aux (depth+1)) |> List.minBy snd

    aux 0 tree |> fst