Метод remove - удаление из MyTreeSet
This commit is contained in:
@@ -65,4 +65,49 @@ public class MyTreeSet<E extends Comparable<E>> {
|
|||||||
if (cmp == 0) return true;
|
if (cmp == 0) return true;
|
||||||
return cmp < 0 ? contains(node.left, element) : contains(node.right, element);
|
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, () -> myTreeSet.contains(null));
|
||||||
assertThrows(NullPointerException.class, () -> treeSet.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