Convert integer list into tree in F#

后端 未结 1 1119
死守一世寂寞
死守一世寂寞 2021-01-27 21:04

I\'m new to F# and would like to know how to convert a simple integer list into a tree.

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

相关标签:
1条回答
  • 2021-01-27 21:35

    The output that you want to get in your answer is a bit poorly formatted, but my interpretation is that you are trying to build a balanced binary tree. To do this recursively, you need to split the input list in two halves and then recursively build tree from the left and the right halves.

    This is a bit tricky, because splitting a functional list in halves is not that simple. In practice, you could probably turn your data into an array and use that, but if you want a functional solution you can use:

    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
    

    The trick in the half function is that it iterates over the list and keeps two copies of the list. From one (called marker), it takes two elements at each step and so by the time this list is empty, you have reached the middle of the original list where we take just one element at each step.

    Now you can write a simple recursive function to build a tree

    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)
    
    0 讨论(0)
提交回复
热议问题