Чтобы определить функцию, которая проверяет, является ли дерево отлично сбалансировано или нет, вы можете посетить только один раз в дерево с помощью алгоритма, приведенного в следующем псевдокоде (я не знаю достаточно синтаксиса Python, чтобы написать явный код):
isBalanced(tree):
if tree is null
then return the tuple (true, 0)
else be (bal1, lev1) the result of calling isBalanced on the left child of tree
and be (bal2, lev2) the result of calling isBalanced on the rigth child of tree
if (bal1 is false) or (bal2 is false)
then exit from the function with the tuple (false, 0)
else if lev1 = lev2
then return the tuple (true, 1+lev1)
else exit from the function with the tuple (false, 0)
в основном алгоритм посещает дерево вычисления рекурсивно, если поддерево является сбалансированным, или нет, и, в случае, если сбалансировано, глубина дерева.
Команда «выход из функции» должна вызывать немедленный выход из всех рекурсивных вызовов функции, если это возможно в Python, иначе это просто возврат из текущего вызова с указанным кортежем.
Конечно, в конце функции полезен только первый компонент кортежа (информация о сбалансированности).
Если вы хотите проверить, сбалансировано ли дерево с разницей в 1 на глубине листьев, вы можете расширить это решение, вернув кортеж с тремя элементами (сбалансированный, минимальная глубина, максимальная глубина) и проверка в общем случае, если глубины (минимум и максимум) детей согласованы (а затем возвращают текущий минимум и максимум).
Слияния код не означает, что он будет более эффективным. – erip