在F#中将整数列表转换为树

时间:2013-10-02 19:41:11

标签: list f# tree

我是F#的新手,想知道如何将简单的整数列表转换为树。

let lst =[1;2;3;4]
type Tree=
 |Leaf of int
 |Node Tree * Tree

列表应该像这样转换为树--->叶1,节点(叶2),节点(节点(叶3,叶4))

1 个答案:

答案 0 :(得分:2)

您希望在答案中得到的输出格式有点差,但我的解释是您正在尝试构建平衡的二叉树。要以递归方式执行此操作,您需要将输入列表分成两半,然后从左半部分和右半部分递归构建树。

这有点棘手,因为将功能列表分成两半并不是那么简单。在实践中,您可能可以将数据转换为数组并使用它,但如果您需要功能性解决方案,则可以使用:

type Tree = Leaf of int | Node of Tree * Tree

let rec half marker acc xs = 
  match xs, marker with
  | x::xs, _::_::marker -> half marker (x::acc) xs
  | x::xs, _::[] -> List.rev (x::acc), xs
  | xs, _ -> List.rev acc, xs

half函数中的技巧是它遍历列表并保留列表的两个副本。从一个(称为marker)开始,每个步骤需要两个元素,所以当这个列表为空时,你已到达原始列表的中间位置,我们每步只需要一个元素。

现在你可以编写一个简单的递归函数来构建一个树

let rec makeTree = function
  | [] -> failwith "Does not work on empty lists"
  | [x] -> Leaf x
  | xs ->  let l, r = half xs [] xs
           Node(makeTree l, makeTree r)