La cancellazione in albero binario di ricerca

voti
0

Così, quando elimino in albero binario di ricerca, ho bisogno di avere come 7 casi diversi vale a dire

  1. Foglia di sinistra;
  2. Foglia destro;
  3. Child Left con il bambino lasciato solo. // vale a dire il nodo da eliminare è il figlio sinistro del suo genitore e che ha lasciato figlio unico.
  4. Child Left solo figlio destro.
  5. figlio destro con il bambino lasciato solo.
  6. figlio destro con un solo figlio destro.
  7. Nodo da eliminare ha sia i bambini cioè a destra ea sinistra.

Ora, quando questo codice sta usando if-elsediventa piuttosto brutto .. c'è qualche altro modo di fare questo.

Ecco il mio frammento di codice

if(current->left==NULL && current->right==NULL && current->key<prev->key)   //left leaf
prev->left=NULL;
else if(current->left==NULL && current->right==NULL && current->key>prev->key) // right     leaf
prev->right=NULL;
else if(current->left!=NULL && current->right==NULL && current->key<prev->key) // left     child with one child
prev->left=current->left;
else if(current->left==NULL && current->right!=NULL && current->key<prev->key)
prev->left=current->right;
else if(current->left!=NULL && current->right==NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left==NULL && current->right!=NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left!=NULL && current->right!=NULL)
{
    check=current->right;
    check1=check;
    while(check->left!=NULL)
    {
    check1=check;
    check=check->left;
    }
    *current=*check;
    check1->left=NULL;
}
È pubblicato 30/09/2011 alle 06:10
fonte dall'utente
In altre lingue...                            


3 risposte

voti
1

L'eliminazione di un puntatore NULL non ha alcun effetto nocivo. Quindi, si dovrebbe essere in grado di fare questo senza casi particolari. La parte fondamentale è semplicemente:

delete current->left;
delete current->right;
Risposto il 30/09/2011 a 06:14
fonte dall'utente

voti
3

È possibile mantenere molto più semplice di quello, e semplicemente te stesso limitare a tre casi in cui l'eliminazione di un nodo da un BST (ricerca binaria albero):

  1. un nodo senza figli (una foglia): basta rimuoverlo - niente esigenze particolari da fare
  2. un nodo con un bambino: rimuoverlo, e spostare il bambino al suo posto
  3. un nodo con due figli: scambiare con o suo predecessore in ordine o successore, e poi rimuoverlo

La pagina wiki contiene un esempio di come questo potrebbe apparire nel codice.

O come un esempio molto semplice in C:

if (current->left==NULL && current->right==NULL) {
    /* leaf node */
    bst_replace(current, NULL);
}
else if (current->left==NULL || current->right==NULL) {
    /* node with one child */
    bst_replace(current, ((current->left) ? current->left : current->right));
}
else {
    /* node with two children */
    Node* successor = bst_next(current);
    current->data = successor->data;
    bst_replace(successor, successor->right);
}
Risposto il 30/09/2011 a 06:18
fonte dall'utente

voti
2

Io non capisco il protocollo utilizzato per l'eliminazione di qui. Lei sembra non avere una 'ricerca' albero binario (nessun ordinamento nella struttura).

Ma per rendere il proprio codice semplice. Si potrebbe fare qualcosa di simile a questo:

bool b1 = (current->left == NULL);
bool b2 = (current->right == NULL);
bool b3 = (current->key > prev->key);

int decision_case = b1 * 4 + b2 * 2 + b3;

switch(decision_case) {
  case 0: // fill in code here
          break;
  ...
  ...
  case 7: // fill in code here
          break;
}

Inoltre, si dovrebbe usare elimina per evitare perdite di memoria qui. Spero possa aiutare.

Risposto il 30/09/2011 a 06:33
fonte dall'utente

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