diff --git a/lab2/src/main/java/ru/spbstu/telematics/java/MyTreeSet.java b/lab2/src/main/java/ru/spbstu/telematics/java/MyTreeSet.java index e4dbd64..6463891 100644 --- a/lab2/src/main/java/ru/spbstu/telematics/java/MyTreeSet.java +++ b/lab2/src/main/java/ru/spbstu/telematics/java/MyTreeSet.java @@ -65,4 +65,49 @@ public class MyTreeSet> { 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; + } } diff --git a/lab2/src/test/java/ru/spbstu/telematics/java/AppTest.java b/lab2/src/test/java/ru/spbstu/telematics/java/AppTest.java index b3c7be3..7b4e555 100644 --- a/lab2/src/test/java/ru/spbstu/telematics/java/AppTest.java +++ b/lab2/src/test/java/ru/spbstu/telematics/java/AppTest.java @@ -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)); + } }