оригинальный вопрос в книге ясно, не говоря уже о дереве будучи двоичную. Я, случается, решаю тот же вопрос, но закодирован в Python. Итак, вот мое итерационное решение проблемы, для общих деревьев (где дочерние узлы хранятся в списке), в python.
def is_balanced_nonrecursive(self):
stack = [self.root]
levels = [0]
current_min = sys.maxint
current_max = 0
current_level = 0
while len(stack) > 0:
n = stack.pop()
current_level = levels.pop()
for c in n.children:
stack.append(c)
levels.append(current_level + 1)
if len(n.children) == 0:
if current_level < current_min:
current_min = current_level
if current_level > current_max:
current_max = current_level
return current_max - current_min < 2
Это, в основном, первый проход по дереву. Мы сохраняем отдельный стек для уровней (список levels
). Если мы увидим какой-либо листовой узел, мы соответственно обновим текущие минимальные и максимальные уровни. Алгоритм пересекает все дерево и в конце, если уровни max и min отличаются более чем одним, тогда дерево не сбалансировано.
Существует множество оптимизаций, например, проверка того, является ли разность min и max более чем одной внутри цикла, и если это так, то немедленно возвратите False
.