L'eliminazione di un nodo da un binario di ricerca albero

voti
0

Il mio programma Binary Search Albero non sembra essere cancellare nulla, quando chiamo il metodo deleteNode. La BST è costruito perfettamente, il suo solo eliminando le nodo che non funziona. Io lo chiamo dal mio principale in questo modo:

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());

Nella mia classe BinarySearchTree a implementare i miei metodi deleteNode come segue:

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();
        }
}
È pubblicato 08/10/2011 alle 18:52
fonte dall'utente
In altre lingue...                            


4 risposte

voti
0

Non al 100% sicuro se questo è il vostro unico problema, ma dovrebbe:

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

in realtà essere:

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

per esempio, si dispone di un solo e per la "e" di funzionamento quando si dovrebbe avere due?

Risposto il 08/10/2011 a 19:25
fonte dall'utente

voti
2

Penso che non sta gestendo la

caso 1: in cui il nodo cancellazione è un nodo foglia

Caso 2: in cui il nodo cancellazione ha solo 1 bambino


l'altro se una parte dovrebbe essere qualcosa di simile.

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;

Il metodo findMin è quello di trovare il successore inorder del nodo da cancellare.

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

Spero che questa risposta alla tua domanda.

Risposto il 08/10/2011 a 20:39
fonte dall'utente

voti
1

La scrittura di codice leggibile rende bug più facile da individuare - sia con se stessi e gli altri. Un primo passo è la scelta di nomi delle variabili più espressiva che temp, temp2e treeTemp.

Inoltre, non è realmente necessario da fare new Integer(x)per assegnare un parametro di metodo di tipo int. Semplicemente scrivendo xinvece ha lo stesso effetto, è più veloce in fase di esecuzione, e rende più facile individuare il codice che conta.

Per quanto riguarda i bug, il primo che vedo è:

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

Questo crea una copia del TreeNode. La modifica quella copia non influenzerà il nodo originale. Inoltre, la copia, probabilmente non ha lefto rightimpostato, dal momento che si passa solo l' valueal costruttore. Mi chiedo perché pensi di aver bisogno di una copia? Dopo tutto, non si crea uno qui uno:

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

Inoltre, come sottolinea Sashwat fuori, se il nodo da eliminare ha meno di 2 bambini, il codice non fa nulla, come nessuna delle condizioni di deleteNodepartite.

Risposto il 09/10/2011 a 00:01
fonte dall'utente

voti
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;
        }
  }
Risposto il 29/01/2013 a 18:54
fonte dall'utente

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