Я кодирую функцию вставки AVL. Скажите, пожалуйста, как я могу определить узел, баланс которого нарушается при вставке нового узла? Я знаю, как рассчитать коэффициент баланса любого узла. Но если я добавлю узел в виде листа, как я могу узнать об узле-предке, чей баланс нарушен? так что я могу применить вращение к нему. Спасибо в ожидании.
Как только вы добавляете лист, вы переходите к родителям один за другим к корню и обновляете их высоту (или глубину, если хотите). Когда вы обновляете высоту деревьев, вы проверяете, не вышли ли они из баланса, и перебалансируете их. Затем вы продолжаете двигаться вверх снова.
Это O(log(n))
операция, поскольку путь от любого листа до корня в дереве AVL содержит O(log(n))
узлы и ребалансировка узла делается в O(1)
Как только вы получите коэффициент баланса (в моем случае (высота левого поддерева — высота правого поддерева)),
Отвечает ли это на ваш вопрос?