Прежде всего, это домашнее задание, поэтому ставим его там.рекурсивное двоичное дерево поиска удаляет метод
Я должен реализовать бинарное дерево поиска с конкретными методами:
недействительной вставки (String), логические удалить (String), и логические найти (String).
Я смог успешно запрограммировать и протестировать методы вставки и поиска, но у меня возникли трудности с удалением.
Что происходит в моей программе, это удаление на самом деле ничего не удаляет из дерева, и я считаю, что это связано с тем, что он ссылается только на локальное создание текущего узла, но я могу ошибаться. Я думаю, что могу реализовать логику различных случаев, которые мне нужны для тестирования (может потребоваться помощь при удалении узла с двумя детьми, но я думаю, что я понимаю его). В основном я пытаюсь понять, что мне нужно сделать по-другому, чтобы ссылаться на дерево должным образом в
current = null; // case
Вот что я получил до сих пор:
public boolean remove(String title)
{
return remove(root, title);
}
private boolean remove(BSTNode current, String title)
{
if (current == null)
{
return false;
}
if (current.data == title)
{
if (current.left_child !=null && current.right_child != null)
{
return true; // returning true since I haven't finished writing this case
}
else if (current.left_child == null && current.right_child == null)
{
current = null; // this should remove the node from tree but it doesn't
return true;
}
else if (current.left_child != null && current.right_child == null)
{
current = current.left_child; // don't think this is right
return true;
}
else if (current.right_child != null && current.left_child == null)
{
current = current.right_child; // not sure about this
return true;
}
}
root = current;
if (title.compareToIgnoreCase(current.data) == -1)
{
return remove(current.left_child, title);
}
else
{
return remove(current.right_child, title);
}
}
Любое знание очень ценится.
Большое спасибо за отзыв. То, что вы описали, это то, что я себе представлял. Где я думаю, моя проблема в том, что у меня нет родительского узла, определенного в классе (инструктор подразумевал, что это менее элегантное решение, чтобы избежать его, если можно). Я пытаюсь понять, как я могу сказать «текущий» узел (base case = root) о родительском, не задавая какой-либо тип ссылки в методе вставки.Я не думаю, что такая реализация возможна, и поэтому я должен включить родителя во вставку, чтобы отслеживать, какой узел является родителем текущего, чтобы я мог изменить его ссылку на нуль. – user2948847
@ user2948847 Действительно, вы не должны хранить родительскую ссылку в каждом узле, это необязательно. См. Мое обновление о том, как найти узел и его родительский элемент. Я бы пошел на версию цикла, но если вам нужно использовать рекурсию, это немного сложнее. Вы можете избавиться от внутреннего класса, выполнив удаление в методе, который я назвал 'find', но это противоречит хорошей практике« разделения проблем »(один метод не должен как найти узел, так и удалить его). –