Binary Search Visualizzazione Albero In Java

voti
1

Ciao Attualmente sto facendo la fase di sperimentazione del mio progetto (Algoritmo Visualization Tool). Io sono sempre un problema con il metodo di eliminazione della mia BST.

 public boolean delete(String key) {
boolean deleted = true;
boolean finished=false;
BNode current = root;
BNode prev = null;
while (!finished) {
  if (key.compareTo(current.key) > 0) {
    prev = current;
    current = current.right;
    this.repaint();
  }
  else if (key.compareTo(current.key) < 0) {
    prev = current;
    current = current.left;
    this.repaint();
  }
  else if (key.compareTo(current.key) == 0) {
      finished=true;
      this.repaint();
  }

}

if (check(current) == 0) {
    if(current==root)
    {
        root=null;
        xPos=400;
        yPos=60;
        this.repaint();
    }
    else
    {
        if (current.key.compareTo(prev.key) > 0) {
            prev.right = null;
            this.repaint();
        }
        else if(current.key.compareTo(prev.key) < 0) {
            prev.left = null;
            this.repaint();
        }
    }

}
else if (check(current) == 1) {
    if(current==root)
    {
        prev=current;
        if (current.left != null) {
            current=current.left;
            prev.key=current.key;
            prev.left = current.left;
            this.repaint();
        }
        else {
            current=current.right;
            prev.key=current.key;
            prev.right = current.right;
            this.repaint();
        }
    }
    else
    {

    if (current.key.compareTo(prev.key) > 0) {
    if (current.left != null) {
      prev.right = current.left;
      this.repaint();
    }
    else {
      prev.right = current.right;
      this.repaint();
    }
  }
  else if(current.key.compareTo(prev.key) < 0) {
    if (current.left != null) {
      prev.left = current.left;
      this.repaint();
    }
    else {
      prev.left = current.right;
      this.repaint();
    }
  }
    }
}
else if (check(current) == 2) {
  BNode temp = inord(current);
  if(current==root)
  {
      root.key=temp.key;
      this.repaint();
  }
  else
  {

      if (current.key.compareTo(prev.key) > 0) {
      prev.right.key = temp.key;
      this.repaint();
    }
    else {
      prev.left.key = temp.key;
      this.repaint(0);
    }
    }
}

return deleted;}

Il codice per la classe BST in sé è molto più lungo. Tutto funziona bene, tranne che quando si tenta di eliminare un nodo senza figlio, ottengo un'eccezione nullpointer quando uso per esempio 9 e 10 come input (provate a del 10) o 5 e 12 (provate a del 12), ma mai se io utente, ad esempio 4 e 8 (provate a del 8) o 9, 6 e 5. credo che il problema è con compareTo.

int check(BNode a) {
int ret;
if ( (a.left != null) && (a.right != null)) {
  ret = 2;
}
else if ( (a.left == null) && (a.right == null)) {
  ret = 0;
}
else {
  ret = 1;
}
return ret;}

Ho davvero bisogno di aiuto con this.I possono inviare tutta la classe, se necessario, essere .. Grazie!

È pubblicato 24/03/2011 alle 17:42
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

A pochi note:

  1. Se si passa nulla per controllare, si otterrebbe un NPE lì.
  2. if( check(current) == 0) ecc -> si dovrebbe verificare una volta e poi eseguire il caso (o anche un interruttore)

Esempio per 2 .:

 int result = check(current);
 switch(result) {
  case 0:
    //do whatever is appropriate
    break;
  case 1:
    //do whatever is appropriate
    break;
  case 2:
    //do whatever is appropriate
    break;
  default:
    //should never happen, either leave it or throw an exception if it ever happens
}

Edit: // In realtà, dimenticare questa modifica, appena visto questo non dovrebbe accadere, ma non è ancora un buon stile

Hai anche cose come questo nel codice:

if (current.left != null) {
    current=current.left;
    prev.key=current.key;
    prev.left = current.left;
    this.repaint();
}
else {
    current=current.right; //this might be null
 ...
}

Se current.leftè nullo e current.rightè nullo, currentsarà nullo in seguito.

Risposto il 24/03/2011 a 18:04
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more