Я работаю над заданием, которое просит меня реализовать дерево AVL. Я уверен, что у меня правильные методы поворота, но мне трудно понять, когда их использовать.AVL Tree Balancing
Например, объяснение в книге говорит о том, что я должен подняться по тому же пути, на который я пошел, чтобы вставить узел/элемент. Тем не менее, я не могу иметь никаких указателей родительских элементов.
Последний код:
public BinaryNode<T> insert(BinaryNode<T> node) {
if (this.getElement().compareTo(node.getElement()) > 0) {
if (this.getLeftChild() != null) {
BinaryNode<T> b = this.getLeftChild().insert(node);
if(!this.isBalanced()) {
this.balance();
}
return b;
} else {
this.setLeftChild(node);
}
} else if (this.getElement().compareTo(node.getElement()) < 0) {
if (this.getRightChild() != null) {
return this.getRightChild().insert(node);
} else {
this.setRightChild(node);
}
}
return this;
}
То, что я хочу сделать здесь подняться обратно вверх по дереву, но он может только проверить балансировку ПОСЛЕ вставляет узел. Следовательно, это находится в предложении else.
Я также попытался ввести балансовый код, где предложил R Samuel Klatchko, но проверил баланс на каждой вставке. Например: если одна вставка 7, 9, 5, 3 и 1 последовательно, я получаю исключение с нулевым указателем при попытке вставить 1.
EDIT: Одна из причин этого может иметь какое-то отношение к тому, как я делал высоту. Он отлично работает с одним вращением вправо, если я каждый раз вычисляю высоту с высотой(), но нарушает время O (log (n)) дерева AVL.
Любые мысли о том, как это сделать?
Так вот, где я должен поставить свой балансировочный алгоритм? Не сразу после того, как я вставляю узел? Я думаю, что мое замешательство исходит из отсутствия полного понимания рекурсии, которая здесь происходит. –
Итак, я опробовал реализацию, аналогичную приведенной выше, и проверяет баланс при движении вверх и вниз. Есть ли способ проверить это только при поднятии? –
Пожалуйста, обновите вопрос с помощью своего последнего кода (и добавьте комментарий, чтобы я знал, когда следует пересматривать). –