Если корень этого дерева меньше, чем корни обоих его поддеревьев, и , то поддеревья также являются кучами, этот корень также должен быть меньше, чем все элементы поддеревьев.
(Потратьте несколько минут, чтобы убедить себя, что это правда.)
Таким образом, вам не нужно перебирать всех детей и внуков (и так далее), вам нужно только проверить корень каждого поддерева и затем рекурсивно проверить «кучу» поддеревьев.
Это проще, если вы сначала определите вспомогательную функцию,
let lesser x heap = match heap with
| EmptyHP -> true
| HP(root, _, _) -> x <= root
, а затем
let rec isHeap heap =
match heap with
| EmptyHP -> true
| HP(r, h1, h2) -> lesser r h1 && lesser r h2 && isHeap h1 && isHeap h2