Skip to content

Commit ea43bdf

Browse files
committed
fix RedBlackTree
1 parent 2eba185 commit ea43bdf

File tree

4 files changed

+64
-4
lines changed

4 files changed

+64
-4
lines changed

net.lecousin.core/src/main/java/net/lecousin/framework/collections/sort/RedBlackTreeInteger.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,11 +472,13 @@ private Node<T> remove(Node<T> h, Node<T> node) {
472472
return null;
473473
if (h.right == null || (!h.right.red && (h.right.left == null || !h.right.left.red)))
474474
h = moveRedRight(h);
475-
if (node.value == h.value) {
475+
if (node.value == h.value && ObjectUtil.equalsOrNull(node.element, h.element)) {
476476
Node<T> x = min(h.right);
477477
h.value = x.value;
478478
h.element = x.element;
479479
h.right = removeMin(h.right, false);
480+
if (h.right == null && last == x)
481+
last = h;
480482
} else {
481483
h.right = remove(h.right, node);
482484
}

net.lecousin.core/src/main/java/net/lecousin/framework/collections/sort/RedBlackTreeLong.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,11 +473,13 @@ private Node<T> remove(Node<T> h, Node<T> node) {
473473
return null;
474474
if (h.right == null || (!h.right.red && (h.right.left == null || !h.right.left.red)))
475475
h = moveRedRight(h);
476-
if (node.value == h.value) {
476+
if (node.value == h.value && ObjectUtil.equalsOrNull(node.element, h.element)) {
477477
Node<T> x = min(h.right);
478478
h.value = x.value;
479479
h.element = x.element;
480480
h.right = removeMin(h.right, false);
481+
if (h.right == null && last == x)
482+
last = h;
481483
} else {
482484
h.right = remove(h.right, node);
483485
}

net.lecousin.core/src/test/java/net/lecousin/framework/core/tests/collections/sort/TestRedBlackTreeInteger.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,13 +199,41 @@ public void testAddAndRemoveWithCommonValues() {
199199
Assert.assertTrue(tree.contains(10, o3));
200200
Assert.assertFalse(tree.contains(10, o4));
201201

202+
tree.add(10, o2);
203+
Assert.assertEquals(3, tree.size());
204+
Assert.assertTrue(tree.contains(10, o1));
205+
Assert.assertTrue(tree.contains(10, o2));
206+
Assert.assertTrue(tree.contains(10, o3));
207+
Assert.assertFalse(tree.contains(10, o4));
208+
202209
tree.remove(getNode(tree, o1));
203-
Assert.assertEquals(1, tree.size());
210+
Assert.assertEquals(2, tree.size());
204211
Assert.assertFalse(tree.contains(10, o1));
212+
Assert.assertTrue(tree.contains(10, o2));
213+
Assert.assertTrue(tree.contains(10, o3));
214+
Assert.assertFalse(tree.contains(10, o4));
215+
216+
tree.add(10, o1);
217+
Assert.assertEquals(3, tree.size());
218+
Assert.assertTrue(tree.contains(10, o1));
219+
Assert.assertTrue(tree.contains(10, o2));
220+
Assert.assertTrue(tree.contains(10, o3));
221+
Assert.assertFalse(tree.contains(10, o4));
222+
223+
tree.remove(getNode(tree, o2));
224+
Assert.assertEquals(2, tree.size());
225+
Assert.assertTrue(tree.contains(10, o1));
205226
Assert.assertFalse(tree.contains(10, o2));
206227
Assert.assertTrue(tree.contains(10, o3));
207228
Assert.assertFalse(tree.contains(10, o4));
208229

230+
tree.remove(getNode(tree, o1));
231+
Assert.assertEquals(1, tree.size());
232+
Assert.assertFalse(tree.contains(10, o1));
233+
Assert.assertFalse(tree.contains(10, o2));
234+
Assert.assertTrue(tree.contains(10, o3));
235+
Assert.assertFalse(tree.contains(10, o4));
236+
209237
tree.remove(getNode(tree, o3));
210238
Assert.assertEquals(0, tree.size());
211239
}

net.lecousin.core/src/test/java/net/lecousin/framework/core/tests/collections/sort/TestRedBlackTreeLong.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,13 +208,41 @@ public void testAddAndRemoveWithCommonValues() {
208208
Assert.assertTrue(tree.contains(10, o3));
209209
Assert.assertFalse(tree.contains(10, o4));
210210

211+
tree.add(10, o2);
212+
Assert.assertEquals(3, tree.size());
213+
Assert.assertTrue(tree.contains(10, o1));
214+
Assert.assertTrue(tree.contains(10, o2));
215+
Assert.assertTrue(tree.contains(10, o3));
216+
Assert.assertFalse(tree.contains(10, o4));
217+
211218
tree.remove(getNode(tree, o1));
212-
Assert.assertEquals(1, tree.size());
219+
Assert.assertEquals(2, tree.size());
213220
Assert.assertFalse(tree.contains(10, o1));
221+
Assert.assertTrue(tree.contains(10, o2));
222+
Assert.assertTrue(tree.contains(10, o3));
223+
Assert.assertFalse(tree.contains(10, o4));
224+
225+
tree.add(10, o1);
226+
Assert.assertEquals(3, tree.size());
227+
Assert.assertTrue(tree.contains(10, o1));
228+
Assert.assertTrue(tree.contains(10, o2));
229+
Assert.assertTrue(tree.contains(10, o3));
230+
Assert.assertFalse(tree.contains(10, o4));
231+
232+
tree.remove(getNode(tree, o2));
233+
Assert.assertEquals(2, tree.size());
234+
Assert.assertTrue(tree.contains(10, o1));
214235
Assert.assertFalse(tree.contains(10, o2));
215236
Assert.assertTrue(tree.contains(10, o3));
216237
Assert.assertFalse(tree.contains(10, o4));
217238

239+
tree.remove(getNode(tree, o1));
240+
Assert.assertEquals(1, tree.size());
241+
Assert.assertFalse(tree.contains(10, o1));
242+
Assert.assertFalse(tree.contains(10, o2));
243+
Assert.assertTrue(tree.contains(10, o3));
244+
Assert.assertFalse(tree.contains(10, o4));
245+
218246
tree.remove(getNode(tree, o3));
219247
Assert.assertEquals(0, tree.size());
220248
}

0 commit comments

Comments
 (0)