Binary Recherche Arbre visualisation En Java

voix
1

Salut, je suis en train de faire la phase de test de mon projet (algorithme outil de visualisation). Je reçois un problème avec la méthode de suppression de mon 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;}

Le code de la classe BST lui-même est beaucoup plus longue. Tout fonctionne bien, sauf que lorsque je tente de supprimer un nœud sans enfant, je reçois une exception nullpointer quand je l'utilise par exemple 9 et 10 en entrée (essayer de del 10) ou 5 et 12 (essayer de del 12) mais jamais si l'utilisateur I par exemple 4 et 8 (essayer de del 8) ou 9, 6 et 5. Je pense que le problème est avec 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;}

J'ai vraiment besoin d'aide avec this.I peut afficher la classe si besoin est .. Merci!

Créé 24/03/2011 à 17:42
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Juste quelques notes:

  1. Si vous passez null à vérifier, vous obtiendrez un NPE là.
  2. if( check(current) == 0) etc. -> vous devriez vérifier une fois, puis exécuter le cas (ou même un interrupteur)

Exemple pour 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: // En fait, oublier cette édition, juste vu cela ne devrait pas arriver, mais il est toujours pas un bon style

Vous avez aussi des choses comme ça dans votre code:

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
 ...
}

Si current.leftest nulle et current.rightest nulle, currentsera nulle après.

Créé 24/03/2011 à 18:04
source utilisateur

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