LeetCode 501. Find Mode in Binary Search Tree in F#

URL

Find Mode in Binary Search Tree - LeetCode

Code

https://github.com/syohex/dotnet-study/tree/master/fsharp/leetcode/problems/0501/main.fsx

open System

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

let findMode (root: Tree) : int list =
    let rec nodeFreq node acc =
        match node with
        | Leaf -> acc
        | Node(v, left, right) ->
            let acc' =
                match Map.tryFind v acc with
                | Some(n) -> Map.add v (n + 1) acc
                | None -> Map.add v 1 acc

            let acc'' = nodeFreq left acc'
            nodeFreq right acc''

    let freq = nodeFreq root Map.empty
    let mode = Map.fold (fun acc _ (v: int) -> Math.Max(acc, v)) -1 freq
    freq |> Map.fold (fun acc k v -> if v = mode then k :: acc else acc) []