Suppression d'un nœud d'un arbre de recherche binaire

voix
0

Mon binaire Rechercher programme Arbre ne semble pas supprimer quoi que ce soit quand je l'appelle la méthode DeleteNode. Le BST est construit parfaitement son juste de supprimer la partie du nœud qui ne fonctionne pas. Je l'appelle de mon principal comme ceci:

System.out.println(Please enter a number you would like to delete from the tree);
    temp = reader.nextLine();
    try {
        int numTemp = Integer.parseInt(temp);
        TreeNode treeTemp = bst.deleteNode(numTemp, bst.getRoot());
        bst.setRoot(treeTemp);
    }
    catch(Throwable e){
        System.err.println(e);
    }
    bst.printInBST(bst.getRoot());

Dans ma classe BinarySearchTree je mets en œuvre mes méthodes de DeleteNode comme suit:

public TreeNode deleteNode(int x, TreeNode temp){
    if(temp != null){
        if(x > (int)((Integer)temp.getValue())){
            temp.setLeft(deleteNode(new Integer(x), temp.getLeft()));
        }
        else if(x < (int)((Integer)temp.getValue())){
            temp.setRight(deleteNode(new Integer(x), temp.getRight()));
        }
        else if(temp.getLeft() != null & temp.getRight() != null){
            TreeNode temp2 = new TreeNode(temp.getRight().getValue());
            while(temp2.getLeft() != null){
                temp2 = temp2.getLeft();
            }
            temp = temp2;
            temp.setRight(remove(temp.getRight()));
        }
    }
    return temp;
}
public TreeNode remove(TreeNode temp){
        if(temp.getLeft() != null){
            temp.setLeft(remove(temp.getLeft()));
            return temp;
        }
        else {
            return temp.getRight();
        }
}
Créé 08/10/2011 à 18:52
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
0

Pas 100% sûr si cela est votre seul problème, mais devrait:

else if(temp.getLeft() != null & temp.getRight() != null)

effectivement:

else if(temp.getLeft() != null && temp.getRight() != null)

vous avez donc une seule et pour la « et » le fonctionnement lorsque vous devriez avoir deux?

Créé 08/10/2011 à 19:25
source utilisateur

voix
2

Je pense que vous n'êtes pas la manipulation des

cas 1: dans laquelle le noeud de suppression est un noeud feuille

Cas n ° 2: où le nœud de suppression a seulement 1 enfant


l'autre si une partie doit être quelque chose comme ça.

else if( temp.getLeft() != null && temp.getRight() != null ) // Two children
{
      temp.setValue( findMin( temp.getRight() ).getValue());
      temp.setRight ( deleteNode( temp.getValue(), temp.getRight() );
}
else
     temp = ( temp.getLeft() != null ) ? temp.getLeft() : temp.getRight();

return temp;

La méthode findMin est de trouver le successeur de envue du nœud à supprimer.

private TreeNode findMin( TreeNode t )
{
        if( t == null )
            return null;
        else if( t.getLeft() == null )
            return t;
        return findMin( t.getLeft() );
}

J'espère que cette réponse à votre question.

Créé 08/10/2011 à 20:39
source utilisateur

voix
1

L' écriture de code lisible rend les bugs plus faciles à repérer - à la fois par vous - même et d' autres. Une première étape consiste à choisir des noms de variables plus expressives que temp, temp2et treeTemp.

En outre, il est vraiment non nécessaire de le faire new Integer(x)pour assigner un paramètre de méthode de type int. Écrivant xa lieu le même effet, est plus rapide lors de l' exécution, et le rend plus facile à repérer le code qui compte.

En ce qui concerne les bugs, le premier que je vois est:

TreeNode temp2 = new TreeNode(temp.getRight().getValue());

Cela crée une copie du TreeNode. Modification de cette copie n'affectera pas le nœud d' origine. En outre, la copie ne probablement pas leftou rightpasser défini, puisque vous ne le valueau constructeur. Je me demande pourquoi pensez avoir besoin d' une copie? Après tout, vous ne créez pas ici non plus :

deleteNode(new Integer(x), temp.getRight())

Ensuite, comme Sashwat souligne, si le nœud de supprimer a moins de 2 enfants, votre code ne fait rien, car aucune des conditions dans les deleteNodematches.

Créé 09/10/2011 à 00:01
source utilisateur

voix
0
  public class BSTNode {

  public boolean remove(int value, BSTNode parent) {
        if (value < this.value) {
              if (left != null)
                    return left.remove(value, this);
              else
                    return false;
        } else if (value > this.value) {
              if (right != null)
                    return right.remove(value, this);
              else
                    return false;
        } else {
              if (left != null && right != null) {
                    this.value = right.minValue();
                    right.remove(this.value, this);
              } else if (parent.left == this) {
                    parent.left = (left != null) ? left : right;
              } else if (parent.right == this) {
                    parent.right = (left != null) ? left : right;
              }
              return true;
        }
  }
Créé 29/01/2013 à 18:54
source utilisateur

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