Напишите функцию, которая возвращает true, если входное двоичное дерево сбалансировано по высоте, и false, если это не так.
Решение кажется очевидным, мы просто по порядку проходим по дереву ввода и вычисляем левую и правую высоты, мы уже видели, как найти высоты с помощью рекурсии в предыдущем решение здесь,при этом нам просто нужно добавить еще одно условие, чтобы проверить, не нарушает ли какой-либо узел условие высоты.
Условие = (высота левого поддерева — высота правого поддерева) ≤ 1
Мы определим пользовательскую структуру, которая содержит высоту текущего узла.
Наш базовый случай — вернуть структуру с нулевой высотой, так как это был бы конечный узел без дочерних элементов.
Если мы не находимся в листовом узле, то идем налево, как в обходе по порядку, а затем направо.
Чтобы найти текущую высоту, мы береммаксимальную высоту как слева, так и справа идобавляем 1, так как текущий узел на один узел выше, чем его дети.
Код доступен здесь.
Временная сложность равна O(n), где n — количество узлов во входном двоичном дереве.
Сложность пространства равна O(h), где h — самая длинная ветвь во входном двоичном дереве, которая будет помещена в стек вызовов при использовании рекурсии.