Метод remove - удаление из MyTreeSet

This commit is contained in:
2025-02-03 18:35:00 +03:00
parent c5277dd0dc
commit b40778d10c
2 changed files with 60 additions and 0 deletions

View File

@@ -65,4 +65,49 @@ public class MyTreeSet<E extends Comparable<E>> {
if (cmp == 0) return true;
return cmp < 0 ? contains(node.left, element) : contains(node.right, element);
}
public boolean remove(E element) {
if (element == null) {
throw new NullPointerException("Null элементы не допускаются");
}
if (!contains(element)) return false;
root = remove(root, element);
return true;
}
private Node remove(Node node, E element) {
if (node == null) return null;
int cmp = element.compareTo(node.value);
if (cmp < 0) {
node.left = remove(node.left, element);
} else if (cmp > 0) {
node.right = remove(node.right, element);
} else {
// Узел для удаления найден
if (node.left == null && node.right == null) {
// Если он является листом, то просто удаляем его
return null;
} else if (node.left == null) {
// Если у него нету левого поддерева, то заменяем правым узлом
return node.right;
} else if (node.right == null) {
// Если у него нету правого поддерева, то заменяем левым узлом
return node.left;
} else {
// Если есть оба поддерева, то заменяем самым наименьшим элементом правого поддерева
Node successor = minValueNode(node.right);
node.value = successor.value;
node.right = remove(node.right, successor.value);
}
}
return node;
}
private Node minValueNode(Node node) {
Node current = node;
while (current.left != null) {
current = current.left;
}
return current;
}
}

View File

@@ -43,4 +43,19 @@ class MyTreeSetTests {
assertThrows(NullPointerException.class, () -> myTreeSet.contains(null));
assertThrows(NullPointerException.class, () -> treeSet.contains(null));
}
@Test
void testRemove() {
assertEquals(myTreeSet.remove(15), treeSet.remove(15));
treeSet.add(15);
myTreeSet.add(15);
assertEquals(myTreeSet.remove(15), treeSet.remove(15));
assertEquals(myTreeSet.remove(50), treeSet.remove(50));
treeSet.add(50);
myTreeSet.add(50);
assertEquals(myTreeSet.remove(50), treeSet.remove(50));
assertThrows(NullPointerException.class, () -> myTreeSet.remove(null));
assertThrows(NullPointerException.class, () -> treeSet.remove(null));
}
}