LeetCode 1609. Even Odd Tree in F#

URL

Even Odd Tree - LeetCode

Code

https://github.com/syohex/dotnet-study/tree/master/fsharp/leetcode/challenge/202402/even_odd_tree/main.fsx

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

let isEvenOddTree (root: Tree) : bool =
    let rec isEvenOddTree' q isEven =
        match q with
        | [] -> true
        | _ ->
            let prev = if isEven then -1 else System.Int32.MaxValue

            let q', _, ok =
                q
                |> List.fold
                    (fun (acc, prev, ok) node ->
                        if not ok then
                            acc, prev, false
                        else
                            match node with
                            | Leaf -> failwith "never reach here"
                            | Node(v, left, right) ->
                                if isEven then
                                    if v % 2 = 1 && prev < v then
                                        right :: left :: acc, v, true
                                    else
                                        acc, v, false
                                else if v % 2 = 0 && prev > v then
                                    right :: left :: acc, v, true
                                else
                                    acc, v, false)
                    ([], prev, true)

            if ok then
                let q'' = q' |> List.filter (fun node -> node <> Leaf) |> List.rev
                isEvenOddTree' q'' (not isEven)
            else
                false

    isEvenOddTree' [ root ] true