LeetCode 637. Average of Levels in Binary Tree in F#

URL

leetcode.com/problems/average-of-levels-in-..

Code

github.com/syohex/dotnet-study/blob/master/..

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

let averageOfLevels (root: Tree) : double list =
    let rec averageOfLevels' node level acc =
        match node with
        | Leaf -> acc
        | Node (v, left, right) ->
            let acc' =
                match Map.tryFind level acc with
                | None -> Map.add level (v, 1) acc
                | Some ((sum, count)) -> Map.add level (sum + v, count + 1) acc

            let acc'' = averageOfLevels' left (level + 1) acc'
            averageOfLevels' right (level + 1) acc''

    let m = averageOfLevels' root 0 Map.empty

    let max =
        m
        |> Map.fold (fun acc k _ -> System.Math.Max(acc, k)) 0

    seq { 0 .. max }
    |> Seq.map (fun i ->
        let sum, count = Map.find i m
        (double sum) / (double count))
    |> Seq.toList