Я пытаюсь проверить, является ли двоичное дерево красно-черным.
Вот некоторые свойства, которые мне нужно проверить:
- Корень черный
- Не может быть 2 последовательных красных узлов.
- Вам необходимо добавить пустые узлы в виде листовых узлов, цвет которых принимается за черный.
- Каждый путь от листа до корня содержит одинаковое количество черных узлов
Каким-то образом все мои тестовые примеры пройдены, но я уверен, что не выполнил номер 4 выше.
Как я могу проверить, имеет ли любая глубина от корня до Empty
(конец) такое же количество черных узлов?
Я определяю свое дерево следующим образом:
type 'a tree = Empty | T of color * 'a tree * 'a * 'a tree
Мой код просто сопоставляет текущее дерево с некоторыми ошибочными случаями и возвращает false. В противном случае вызовите рекурсивную функцию в левой и правой ветвях.
let rec good_RB t = match t with
| Empty -> true
| T (R, T (R, _, _, _), _, _)
| T (R , _, _, T (R, _, _, _)
-> false
| T (_, lft, _, rgt) -> good_RB lft && good_RB rgt