Удаление элемента из двоичного дерева поиска
Удаление элемента из двоичного дерева поиска немного сложнее предыдущих шагов, так как нам нужно обрабатывать разные случаи в зависимости от типа узла:
- Если узел не имеет дочерних узлов (листовой узел), просто удалите его.
- Если узел имеет только одного дочернего узла, замените его единственным дочерним узлом.
- Если узел имеет два дочерних узла, замените его минимальным значением из правого поддерева или максимальным значением из левого поддерева.
public static BSTNode delete(int value, BSTNode current) {
if (current == null)
return current;
if (value < current.value)
current.leftChild = delete(value, current.leftChild);
else if (value > current.value)
current.rightChild = delete(value, current.rightChild);
else if (value == current.value) {
if (current.leftChild!= null && current.rightChild!= null) {
int min = current.rightChild.value;
BSTNode temp = current.rightChild;
while (temp.leftChild!= null) {
min = temp.leftChild.value;
temp = temp.leftChild;
}
current.value = min;
current.rightChild = delete(min, current.rightChild);
} else if (current.leftChild == null)
return current.rightChild;
else if (current.rightChild == null)
return current.leftChild;
}
return current;
}
Для тестирования этого метода удалите несколько узлов и распечатайте дерево:
public static void main(String[] args) {
BSTNode root = new BSTNode(12);
root = insert(7, root);
root = insert(20, root);
root = insert(5, root);
root = insert(9, root);
root = insert(21, root);
// Delete some nodes
root = delete(12, root);
root = delete(20, root);
root = delete(9, root);
// Print the tree to verify the deletion
System.out.println("Traversal after deletion: ");
inorderTraversal(root);
}
Результат:
Traversal after deletion:
5 7 21