hs3-lab
Задание на третью лабораторную работу
###Реализовать:
- Тип данных для представления произвольного дерева
- Функцию обработки дерева в соответствии с вариантом задания
- Функцию генерации случайного дерева. Для получения последовательности случайных
чисел можно использовать генератор псевдослучайных чисел типа
StdGen
и функциюrandom
, или функции получения случайных значений из внешнего мираrandomIO
,randomRIO
, и т.д. В первом случае сложность может возникнуть в правильной передаче нового состояния вашего генератора дальнейшим вычислениям. В этом случае удобно обернуть генерирующие функции в монадуState
. Во втором случае придётся работать внутри монады IO, что может быть неприятно. Номера заданий такие же, как и в первой лабораторной работе. Для многих заданий полезно опередить дерево как экземпляр классаMonoid
Номера вариантов совпадают с первой лабораторной.
###Тесты Нужно будет написать тесты, в которых проверить работу программы на нескольких модельных примерах, показывающих правильность реализованного алгоритма, а также на случайно сгенерированном дереве.
###Определения Глубиной вершины дерева называется длина пути в эту вершину из корня. Глубиной (высотой) дерева называется максимальная глубина его вершин. Листом или терминальной вершиной дерева называется вершина, не имеющая поддеревьев. Степенью вершины называется число исходящих из неё ветвей. Степенью дерева называется максимальная степень его вершин. Шириной уровня дерева называется число вершин на данной глубине. Шириной дерева называется максимальная ширина по всем уровням. Подобие деревьев отличается от равенства возможным несовпадением значений данных, хранящихся в узлах.
###Варианты заданий
- Определить ширину дерева
- Определить глубину максимальной вершины дерева
- Определить глубину дерева
- Определить степень дерева
- Определить число нетерминальных вершин дерева
- Определить число вершин дерева, степень которых совпадает со степенью дерева
- Определить уровень дерева, на котором находится максимальное число вершин
- Определить значение листа дерева, имеющего минимальную глубину
- Определить значение нетерминальной вершины дерева с максимальной глубиной
- Проверить, находятся ли во всех листьях двоичного дерева элементы со значениями в заданном диапазоне
- Определить число вершин дерева, степень которых совпадает со значением элемента
- Проверить монотонность возрастания ширины уровня дерева
- Проверить монотонность убывания ширины уровня дерева
- Проверить, является ли дерево линейным списком вершин
- Проверить, находятся ли все листья дерева на одном уровне
- Увеличить значения всех листьев дерева на их уровень
- Увеличить на единицу значения листьев дерева, находящихся на нечётных уровнях
- Добавить произвольный элемент в дерево
- Найти количество вхождений элемента в дерево
- Удалить элемент из дерева
- Проверить, является ли дерево симметричным (равным своему отражению)
- Проверить, является ли двоичное дерево самоподобным (подобным своему отражению)