Я пытаюсь написать метод, который рекурсивно удаляет узел из двоичного дерева поиска. Я понимаю алгоритм, но мой код в настоящее время возвращает ошибку. Когда я пытаюсь удалить листовой узел, то есть узел, у которого нет дочерних элементов, он удаляет этот узел, а также самый верхний узел дерева.Ошибка метода удаления двоичного дерева поиска
У меня уже есть методы поиска головы узла, getValue()
, а также поиск левого и правого поддеревьев, getLeft()
и getRight()
. У меня также есть метод isEmpty()
, который проверяет, пусто ли дерево.
Это мой код в настоящее время, где х узел должен быть удален и является бинарное дерево поиска:
public static Tree delete(int x, Tree a) {
if (a.isEmpty()) {
return new Tree();
} if (x>a.getValue()) {
return delete(x, a.getRight());
} else if (x<a.getValue()) {
return delete(x, a.getLeft());
} else {
if (a.getLeft().isEmpty()&&a.getRight().isEmpty()) {
return new Tree();
} if (a.getRight().isEmpty()) {
return delete(x, a.getLeft());
} if (a.getLeft().isEmpty()) {
return delete(x, a.getRight());
} else {
return new Tree(); //not yet completed
}
}
}
Может кто-нибудь дать мне какие-либо подсказки относительно того, почему это будет происходить? Заранее спасибо
Edit: Вот код, который в конечном счете работал, если кто-то случается наткнуться этот вопрос
public static Tree delete(int x, Tree a) {
if (a.isEmpty()) {
return new Tree();
} if (x>a.getValue()) {
return new Tree(a.getValue(), a.getLeft(), delete(x, a.getRight()));
} else if (x<a.getValue()) {
return new Tree(a.getValue(), delete(x, a.getLeft()), a.getRight());
} else {
if (a.getLeft().isEmpty()&&a.getRight().isEmpty()) {
return new Tree();
} if (a.getRight().isEmpty()) {
return new Tree(a.getLeft().getValue(), delete(a.getLeft().getValue(), a.getLeft()), a.getRight());
} if (a.getLeft().isEmpty()) {
return new Tree(a.getRight().getValue(), a.getLeft(), delete(a.getRight().getValue(), a.getRight()));
} else {
return new Tree(max(a.getLeft()), delete(max(a.getLeft()), a.getLeft()), a.getRight());
}
}
}
Спасибо, так что вы могли бы предложить что-то больше вдоль этих линий: 'если (.. A.getLeft() IsEmpty() && a.getRight() IsEmpty()) { \t \t \t \t возвращение новое дерево (а. getValue(), delete (x, a.getLeft()), (delete (x, a.getRight())); ' – Ganso
Вы на правильном пути. – JustinKSU