Esta es la continuación de este post:
Balanceos con árboles set.
Este es el problema, resulta que tengo el siguiente error:
Cita: java.lang.Exception
at treesetsimple.test.Test.comprobar_que(Test.java:6)
at treesetsimple.test.DownTest.probando_borrado(DownT est.java:36)
at treesetsimple.test.DownTest.test(DownTest.java:44)
at treesetsimple.interfaz.Cuerpo.main(Cuerpo.java:13)
Lo que no me doy cuenta es dónde está la falla del remove de MyTreeMap porque el primer elemento lo borra pero el siguiente no, sacando a Franco de la línea 43 de la clase DownTest.java anda, por alguna razón no me borra Franco:
Código Java:
Ver originalprobando_borrado
(restart
(),
new Object[]{"Deborah",
"Franco",
"Denisse"});
Este es el remove de MyTreeSet (en las líneas 52, 53 y 54) que delega de MyTreeMap:
Código Java:
Ver original@Override
public boolean remove
(Object o
) { return map.remove(o) == PRESENT;
}
Es el remove de MyTreeMap.java dónde supuestamente estaría el error:
Código Java:
Ver original@Override
Entry<K,V> p = getEntry(key);
if (p == null) {
return null;
} else {
V oldValue = p.value;
deleteEntry(p);
return oldValue;
}
}
private void deleteEntry(Entry<K,V> p) {
size--;
Entry<K,V> tmp = new Entry();
Entry<K,V> y = (leftOf(p) == null || rightOf(p) == null) ? p : higherEntry(p.getKey());
Entry<K,V> x = (leftOf(y) != null) ? leftOf(y) : (rightOf(y) != null ? rightOf(y) : tmp);
x.parent = parentOf(y);
if (parentOf(y) == null) {
root = (x == tmp ? null : x);
} else {
if (y == leftOf(parentOf(y))) {
y.parent.left = (x == tmp) ? null : x;
} else {
y.parent.right = (x == tmp) ? null : x;
}
}
if (y != p){
p = y;
}
if (colorOf(y) == BLACK) {
fixDown(x);
}
}
private void fixDown(Entry<K,V>x){
while(x != root && colorOf(x) == BLACK) {
if(x == parentOf(leftOf(x))) {
Entry<K,V> sib = parentOf(rightOf(x));
if(colorOf(sib) == RED) {
setColor(sib, BLACK);
setColor(parentOf(x), RED);
rotateLeft(x.parent);
sib = parentOf(rightOf(x));
}
if(colorOf(leftOf(sib)) == BLACK && colorOf(rightOf(sib)) == BLACK) {
setColor(sib, RED);
x = parentOf(x);
} else {
if(colorOf(rightOf(sib)) == BLACK) {
setColor(leftOf(sib), BLACK);
setColor(sib, RED);
rotateRight(sib);
sib = rightOf(parentOf(x));
}
setColor(sib, colorOf(parentOf(x)));
setColor(parentOf(x), BLACK);
setColor(rightOf(sib), BLACK);
rotateLeft(x.parent);
x = root;
}
} else {
Entry<K,V> sib = leftOf(parentOf(x));
if(colorOf(sib) == RED) {
setColor(sib, BLACK);
setColor(parentOf(x), RED);
rotateRight(x.parent);
sib = leftOf(parentOf(x));
}
if(colorOf(rightOf(sib)) == BLACK && colorOf(leftOf(sib)) == BLACK){
setColor(sib, RED);
x = parentOf(x);
} else {
if(colorOf(leftOf(sib)) == BLACK) {
setColor(rightOf(sib), BLACK);
setColor(sib, RED);
rotateLeft(sib);
sib = leftOf(parentOf(x));
}
setColor(sib, colorOf(parentOf(x)));
setColor(parentOf(x), BLACK);
setColor(leftOf(sib), BLACK);
rotateRight(x.parent);
x = root;
}
}
}
setColor(x, BLACK);
}
Puse los métodos que usa internamente remove por si la falla está en dónde menos espero.
Espero sus respuestas y saludos.