Метод remove - удаление из MyTreeSet
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user