@@ -177,62 +177,61 @@ private void balanceAfterInsert(RedBlackNode<T> node) {
177
177
* {@inheritDoc}
178
178
*/
179
179
@Override
180
- protected Node<T> removeValue(T value) {
181
- RedBlackNode<T> nodeRemoved = (RedBlackNode<T>) super.getNode(value);
182
- removeNode(nodeRemoved);
183
- return nodeRemoved;
184
- }
180
+ protected Node<T> removeNode(Node<T> node) {
181
+ RedBlackNode<T> nodeToRemoved = (RedBlackNode<T>)node;
182
+ if (nodeToRemoved == null) return nodeToRemoved;
185
183
186
- /**
187
- * {@inheritDoc}
188
- */
189
- @Override
190
- protected void removeNode(Node<T> node) {
191
- RedBlackNode<T> nodeRemoved = (RedBlackNode<T>)node;
192
- if (nodeRemoved == null) return;
193
-
194
- if (nodeRemoved.isLeaf()) {
184
+ if (nodeToRemoved.isLeaf()) {
195
185
// No children
196
- nodeRemoved .id = null;
197
- if (nodeRemoved .parent == null) {
186
+ nodeToRemoved .id = null;
187
+ if (nodeToRemoved .parent == null) {
198
188
root = null;
199
189
} else {
200
- nodeRemoved .id = null;
201
- nodeRemoved .color = BLACK;
202
- nodeRemoved .lesser = null;
203
- nodeRemoved .greater = null;
190
+ nodeToRemoved .id = null;
191
+ nodeToRemoved .color = BLACK;
192
+ nodeToRemoved .lesser = null;
193
+ nodeToRemoved .greater = null;
204
194
}
205
195
} else {
196
+ // Keep the id and assign it to the replacement node
197
+ T id = nodeToRemoved.id;
198
+
206
199
// At least one child
207
- RedBlackNode<T> lesser = (RedBlackNode<T>) nodeRemoved .lesser;
208
- RedBlackNode<T> greater = (RedBlackNode<T>) nodeRemoved .greater;
200
+ RedBlackNode<T> lesser = (RedBlackNode<T>) nodeToRemoved .lesser;
201
+ RedBlackNode<T> greater = (RedBlackNode<T>) nodeToRemoved .greater;
209
202
if (lesser.id != null && greater.id != null) {
210
203
// Two children
211
204
RedBlackNode<T> greatestInLesser = (RedBlackNode<T>) this.getGreatest(lesser);
212
205
if (greatestInLesser == null || greatestInLesser.id == null) greatestInLesser = lesser;
213
206
// Replace node with greatest in his lesser tree, which leaves
214
207
// us with only one child
215
- replaceValueOnly(nodeRemoved , greatestInLesser);
216
- nodeRemoved = greatestInLesser;
208
+ replaceValueOnly(nodeToRemoved , greatestInLesser);
209
+ nodeToRemoved = greatestInLesser;
217
210
}
218
211
219
212
// Handle one child
220
- RedBlackNode<T> child = (RedBlackNode<T>) ((nodeRemoved .lesser.id != null) ? nodeRemoved .lesser : nodeRemoved .greater);
221
- if (nodeRemoved .color == BLACK) {
222
- if (child.color == BLACK) nodeRemoved .color = RED;
223
- boolean result = balanceAfterDelete(nodeRemoved );
224
- if (!result) return;
213
+ RedBlackNode<T> child = (RedBlackNode<T>) ((nodeToRemoved .lesser.id != null) ? nodeToRemoved .lesser : nodeToRemoved .greater);
214
+ if (nodeToRemoved .color == BLACK) {
215
+ if (child.color == BLACK) nodeToRemoved .color = RED;
216
+ boolean result = balanceAfterDelete(nodeToRemoved );
217
+ if (!result) return nodeToRemoved ;
225
218
}
226
- replaceWithChild(nodeRemoved, child);
227
- if (root.equals(nodeRemoved)) {
219
+ // Replacing node with child
220
+ replaceWithChild(nodeToRemoved, child);
221
+ // Add the id to the child because it represents the node
222
+ // that was removed.
223
+ child.id = id;
224
+ if (root.equals(nodeToRemoved)) {
228
225
root.parent = null;
229
226
((RedBlackNode<T>)root).color = BLACK;
230
227
// If we replaced the root with a leaf, just null out root
231
- if (nodeRemoved .isLeaf()) root = null;
228
+ if (nodeToRemoved .isLeaf()) root = null;
232
229
}
230
+ nodeToRemoved = child;
233
231
}
234
232
235
233
size--;
234
+ return nodeToRemoved;
236
235
}
237
236
238
237
/**
0 commit comments