Проблемы с удалением узла бинарного дерева поиска

Я пишу бинарное дерево поиска, и я почти закончил. У меня проблемы с удалением узлов.

Каждый узел имеет ссылку на свой левый, правый и родительский узлы (корневому узлу присваивается фиктивный родительский элемент), элемент данных и число целых чисел (называемых копиями). Когда человек вводит элемент, который уже существует, узел просто увеличивает его копию, а когда он вызывает функцию 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;

}

Это работает с большинством входных данных, но иногда, когда я добавляю большое количество слов, а затем удаляю одни и те же слова по порядку, у меня возникают проблемы с циклическими ссылками и потерей узлов. Я пытался отследить, где проблема, но я не могу воспроизвести условия ошибки в меньших масштабах (мне нужно вылить довольно большие файлы, чтобы это произошло, чтобы отладить), и я ничего не вижу очевидно неправильно.

Надеясь, что кто-то может помочь мне пролить свет. Спасибо

0 ответов

Другие вопросы по тегам