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

Hola FuzzyLog por responder, hice lo que me dijiste y no funcionó:

Código Java:
Ver original
  1. private void probando_borrado(Object[]arreglo, Object[]criterio) throws Exception{
  2.             set.clear();
  3.             for (Object obj : arreglo) {
  4.                 set.add(obj.toString());
  5.             }            
  6.             MyTreeSet<String>aux = set;
  7.             for(Object c : criterio){
  8.                 if(c == null){
  9.                     aux.remove(null);
  10.                     this.comprobar_que(!set.contains(null));
  11.                 } else {
  12.                     aux.remove(c.toString());
  13.                     this.comprobar_que(!set.contains(c.toString()));
  14.                 }                        
  15.             }
  16.         }

Depuré el código y aquí esta el resultado:

Cita:
El órden después de insertar los string al set:

"Deborah" < - > "Denisse" < - > "Franco" < - > "Manuela" < - > "Miguel" < - > "Tommy"

Cuando quiero borrar a "Franco"

línea 343 : decrementa el tamaño a 1 menos
línea 351 : y tiene la entrada "Manuela"
línea 359 : x es nulo
línea 361 : el pariente de x pasa a ser Miguel
linea 367 : como el pariente de x no es nulo, entra en la contradicción (else)
línea 377 : como y es igual al izquierdo del pariente de y, entra en la condición (if)
línea 378 : el izquierdo del pariente de y, pasa a ser nulo
línea 389 : al ser distintos (y) y (p), entra en la condición
línea 390 : p toma el valor de y
línea 395 : como el color de y no es negro, no entra en el if.
El problema parece ser el órden de los datos a eliminar y ahí es dónde no me doy cuenta que arreglar si el deleteEntry (que parece lo más evidente a arreglar) o que.

Pondré el código del deleteEntry de MyTreeMap.java, ya que puede que no mires el repositorio de github, pero otro lado por dónde mirarlo no se me ocurre:

Código Java:
Ver original
  1. private void deleteEntry(Entry<K,V> p) {
  2.         // Decrementa la cantidad de elementos en el árbol.
  3.         size--;
  4.         // Creamos una nueva entrada vacía.
  5.         Entry<K,V> tmp = new Entry();
  6.         /*
  7.             Creamos una entrada llamada y y mediante un operador ternario si
  8.             la izquierda o derecha de p es nula que y tenga el valor de p de
  9.             lo contrario de obtenga al siguiente de p.
  10.         */
  11.         Entry<K,V> y = (leftOf(p) == null || rightOf(p) == null) ? p : higherEntry(p.getKey());
  12.         /*
  13.             Luego creo otra entrada llamada x y mediante operador ternario
  14.             si la izquierda de y no es nula, x tendrá como valor la izquierda
  15.             de y de lo contrario otro operador ternario dentro del primero que
  16.             si la derecha de y no es nula que x obtenga como valor la derecha
  17.             de y  de lo contrario obtendrá la entrada vacía.
  18.         */
  19.         Entry<K,V> x = (leftOf(y) != null) ? leftOf(y) : (rightOf(y) != null ? rightOf(y) : tmp);        
  20.         // Al pariente de x se le asignará como valor el pariente de y
  21.         x.parent = parentOf(y);
  22.         /*
  23.             Sí el pariente de y es nulo, la raíz del árbol se le asignará como
  24.             valor mediante operador ternario que si x es una entrada vacía
  25.             la raíz será nula de lo contrario x será el valor de la raíz
  26.         */
  27.         if (parentOf(y) == null) {
  28.             root = (x == tmp ? null : x);
  29.         } else {
  30.             /*
  31.                 Ahora si el pariente de y no es nulo, entramos en otra
  32.                 condición que si y es igual al izquierdo del pariente de y
  33.                 el izquierdo del pariente de y tendrá como valor mediente
  34.                 operador ternario si x es una entrada vacía será nulo sino
  35.                 su valor será x
  36.             */
  37.             if (y == leftOf(parentOf(y))) {
  38.                 y.parent.left = (x == tmp) ? null : x;
  39.             } else {
  40.                 /*
  41.                     De lo contrario el derecho del pariente de y tendrá como
  42.                     valor por operador ternario si x es una entrada vacía
  43.                     su valor será nulo sino será x
  44.                 */
  45.                 y.parent.right = (x == tmp) ? null : x;
  46.             }
  47.         }
  48.         // Si y es distinto de p, a p se le asignará como valor y
  49.         if (y != p){
  50.             p = y;
  51.         }
  52.         /*  Y si el color de y es negro, el árbol será balanceado para
  53.             actualizarse luego de la eliminación
  54.         */
  55.         if (colorOf(y) == BLACK) {
  56.             fixDown(x);
  57.         }
  58.     }

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias