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