AVL-проверка дерева
Вы действительно правильно поняли. Но вы упустили использование рекурсивного определения высоты дерева
height(node) = 1 + max(height(node.left), height(node.right))
, поэтому вы получили огромную сложность (хотя O(2^n)
слишком пессимистично). Вместо непосредственного вычисления высоты узла при подходе сверху вниз, вы можете пойти другим путем и вычислить высоту отдельных узлов снизу вверх:
valid_avl(node):
if node is null then
return -1, True
left_height, left_valid = valid_avl(node.left)
right_height, right_valid = valid_avl(node.right)
if not left_valid or not right_valid or abs(left_height - right_height) > 1 then
return -1, False
else
return 1 + max(left_height, right_height), True
Возможно, вы захотите разделить эту функцию на две функции и избежать использования кортежей, в зависимости от языка, который вы используете. Обратите внимание, что выше, хотя выглядит похожим на Python просто псевдокод !!!
Восстановление дерева
Это на самом деле довольно просто. Получите все значения в дереве в level-order и вставьте их точно в этом порядке. Таким образом, дерево никогда не перебалансируется, и каждый узел автоматически помещается в правильное положение.