Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/10/2018, 11:53
Avatar de detective_jd
detective_jd
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Problema al borrar en árbol Set casero

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 original
  1. probando_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
  1. @Override
  2.     public boolean remove(Object o) {
  3.         return map.remove(o) == PRESENT;
  4.     }

Es el remove de MyTreeMap.java dónde supuestamente estaría el error:

Código Java:
Ver original
  1. @Override
  2.     public V remove(Object key) {
  3.         Entry<K,V> p = getEntry(key);
  4.         if (p == null) {
  5.             return null;
  6.         } else {
  7.             V oldValue = p.value;
  8.             deleteEntry(p);            
  9.             return oldValue;
  10.         }
  11.     }
  12. private void deleteEntry(Entry<K,V> p) {
  13.         size--;
  14.         Entry<K,V> tmp = new Entry();
  15.         Entry<K,V> y = (leftOf(p) == null || rightOf(p) == null) ? p : higherEntry(p.getKey());
  16.         Entry<K,V> x = (leftOf(y) != null) ? leftOf(y) : (rightOf(y) != null ? rightOf(y) : tmp);        
  17.         x.parent = parentOf(y);
  18.         if (parentOf(y) == null) {
  19.             root = (x == tmp ? null : x);
  20.         } else {
  21.             if (y == leftOf(parentOf(y))) {
  22.                 y.parent.left = (x == tmp) ? null : x;
  23.             } else {
  24.                 y.parent.right = (x == tmp) ? null : x;
  25.             }
  26.         }
  27.         if (y != p){
  28.             p = y;
  29.         }
  30.         if (colorOf(y) == BLACK) {
  31.             fixDown(x);
  32.         }
  33.     }
  34. private void fixDown(Entry<K,V>x){
  35.         while(x != root && colorOf(x) == BLACK) {
  36.             if(x == parentOf(leftOf(x))) {                
  37.                 Entry<K,V> sib = parentOf(rightOf(x));
  38.                 if(colorOf(sib) == RED) {
  39.                     setColor(sib, BLACK);
  40.                     setColor(parentOf(x), RED);
  41.                     rotateLeft(x.parent);
  42.                     sib = parentOf(rightOf(x));
  43.                 }
  44.                 if(colorOf(leftOf(sib)) == BLACK && colorOf(rightOf(sib)) == BLACK) {
  45.                     setColor(sib, RED);
  46.                     x = parentOf(x);
  47.                 } else {
  48.                     if(colorOf(rightOf(sib)) == BLACK) {
  49.                         setColor(leftOf(sib), BLACK);
  50.                         setColor(sib, RED);
  51.                         rotateRight(sib);
  52.                         sib = rightOf(parentOf(x));
  53.                     }
  54.                     setColor(sib, colorOf(parentOf(x)));
  55.                     setColor(parentOf(x), BLACK);
  56.                     setColor(rightOf(sib), BLACK);
  57.                     rotateLeft(x.parent);
  58.                     x = root;
  59.                 }
  60.             } else {
  61.                 Entry<K,V> sib = leftOf(parentOf(x));                
  62.                 if(colorOf(sib) == RED) {
  63.                     setColor(sib, BLACK);
  64.                     setColor(parentOf(x), RED);
  65.                     rotateRight(x.parent);
  66.                     sib = leftOf(parentOf(x));
  67.                 }
  68.                 if(colorOf(rightOf(sib)) == BLACK && colorOf(leftOf(sib)) == BLACK){
  69.                     setColor(sib, RED);
  70.                     x = parentOf(x);
  71.                 } else {                    
  72.                     if(colorOf(leftOf(sib)) == BLACK) {
  73.                         setColor(rightOf(sib), BLACK);
  74.                         setColor(sib, RED);
  75.                         rotateLeft(sib);                        
  76.                         sib = leftOf(parentOf(x));
  77.                     }
  78.                     setColor(sib, colorOf(parentOf(x)));
  79.                     setColor(parentOf(x), BLACK);
  80.                     setColor(leftOf(sib), BLACK);
  81.                     rotateRight(x.parent);
  82.                     x = root;
  83.                 }
  84.             }
  85.         }
  86.         setColor(x, BLACK);
  87.     }

Puse los métodos que usa internamente remove por si la falla está en dónde menos espero.
Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias