Suppression dans l'arbre de recherche binaire

voix
0

Alors, quand je supprimer dans l'arbre de recherche binaire, ai-je besoin d'avoir comme 7 cas différents à savoir

  1. Feuille gauche;
  2. Feuille droit;
  3. enfant laissé seul enfant gauche. //-à-dire le noeud à supprimer est l'enfant gauche de son parent et il n'a que l'enfant reste.
  4. Enfant gauche avec enfant unique droit.
  5. droit de l'enfant avec l'enfant ne reste.
  6. droit de l'enfant avec enfant unique droit.
  7. Noeud à supprimer a deux enfants à savoir droite et à gauche.

Maintenant , lorsque ce code utilise if-elseça devient assez méchant .. est - il une autre façon de le faire.

Voici mon extrait de code

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;
}
Créé 30/09/2011 à 06:10
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
1

Suppression d'un pointeur NULL n'a aucun effet malade. Donc, vous devriez être en mesure de le faire sans cas particuliers. La partie de base est juste:

delete current->left;
delete current->right;
Créé 30/09/2011 à 06:14
source utilisateur

voix
3

Vous pouvez le garder beaucoup plus simple que cela, et vous limiter simplement à trois cas lors de la suppression d'un nœud d'un BST (arbre de recherche binaire):

  1. un noeud sans enfant (une feuille): enlever juste - rien des besoins particuliers à faire
  2. un nœud avec un enfant: enlever et déplacer l'enfant à sa place
  3. un nœud avec deux enfants: l'échanger soit avec son prédécesseur en ordre ou successeur, puis retirez-le

La page wiki contient un exemple de la façon dont cela pourrait regarder dans le code.

Ou comme un exemple très basique en 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);
}
Créé 30/09/2011 à 06:18
source utilisateur

voix
2

Je ne comprends pas vraiment le protocole utilisé pour la suppression ici. Vous semblez ne pas avoir un arbre « recherche » binaire (pas de commande dans l'arbre).

Mais juste faire le simple code. Vous pouvez faire quelque chose comme ceci:

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

, Vous devez également utiliser supprimer pour éviter les fuites de mémoire ici. J'espère que cela pourra aider.

Créé 30/09/2011 à 06:33
source utilisateur

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