Проблемы с удалением узла бинарного дерева поиска
Я пишу бинарное дерево поиска, и я почти закончил. У меня проблемы с удалением узлов.
Каждый узел имеет ссылку на свой левый, правый и родительский узлы (корневому узлу присваивается фиктивный родительский элемент), элемент данных и число целых чисел (называемых копиями). Когда человек вводит элемент, который уже существует, узел просто увеличивает его копию, а когда он вызывает функцию mentmentCopies(), этот метод уменьшает количество копий и возвращает false, если число копий падает ниже 1. SetLeft() и setRight Методы () устанавливают родительский узел данного узла в качестве вызываемого узла (т. е. node1.setLeft(node2) устанавливает родительского узла node2 равным node1).
Вот метод удаления:
public void remove(T target) {
if (target == null)
throw new IllegalArgumentException();
// cont is container, the node containing the
// desired element.
boolean rootRemoval;
boolean contIsLeft;
CountingNode<T> cont;
CountingNode<T> parent;
CountingNode<T> left;
CountingNode<T> right;
CountingNode<T> grad;
assert root != null;
if (root == null) {
return;
}
else {
cont = root.getNodeFor(target);
}
assert cont != null;
if (cont == null) {
return;
}
else if (cont.decrementCopies()) {
words -= 1;
return;
}
words -= 1;
nodes -= 1;
parent = cont.getParent();
left = cont.getLeft();
contIsLeft = parent.getLeft() == cont;
rootRemoval = cont == root;
if (cont.getNumChildren() < 2) {
parent.setChild(cont.getOnlyChild(), contIsLeft);
if (rootRemoval) {
root = dummyParent.getOnlyChild();
}
return;
}
right = cont.getRight();
grad = left.getRightMostNode();
grad.getParent().setRight(grad.getLeft());
if (grad != left)
grad.setLeft(left);
else
grad.setLeft(null);
grad.setRight(right);
parent.setChild(grad, contIsLeft);
if (rootRemoval) {
root = dummyParent.getOnlyChild();
}
return;
}
Это работает с большинством входных данных, но иногда, когда я добавляю большое количество слов, а затем удаляю одни и те же слова по порядку, у меня возникают проблемы с циклическими ссылками и потерей узлов. Я пытался отследить, где проблема, но я не могу воспроизвести условия ошибки в меньших масштабах (мне нужно вылить довольно большие файлы, чтобы это произошло, чтобы отладить), и я ничего не вижу очевидно неправильно.
Надеясь, что кто-то может помочь мне пролить свет. Спасибо