Supresión en árbol binario de búsqueda

votos
0

Así que cuando se borra en el árbol binario de búsqueda, ¿necesito tener como 7 casos diferentes es decir,

  1. Hoja izquierda;
  2. Hoja derecho;
  3. hijo izquierdo con niño sólo la izquierda. // es decir, el nodo que desea eliminar es el hijo izquierdo de su padre y sólo ha dejado niño.
  4. Niño con la izquierda hijo único derecho.
  5. hijo derecho con niño sólo la izquierda.
  6. hijo derecho con sólo el hijo derecho.
  7. Nodo que desea eliminar tanto los niños ha, es decir, a derecha e izquierda.

Ahora, cuando este código está utilizando if-elsese pone bastante desagradable .. ¿hay alguna otra manera de hacerlo.

Aquí está mi fragmento de código

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;
}
Publicado el 30/09/2011 a las 06:10
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
1

La eliminación de un puntero NULL no tiene efecto negativo. Por lo tanto, usted debe ser capaz de hacer esto sin casos especiales. La parte básica es:

delete current->left;
delete current->right;
Respondida el 30/09/2011 a las 06:14
fuente por usuario

votos
3

Se puede mantener mucho más simple que eso, y simplemente se limite a tres casos al eliminar un nodo de un BST (árbol binario de búsqueda):

  1. un nodo sin hijos (una hoja): basta con retirar - nada necesidades especiales que hacer
  2. un nodo con un hijo: eliminarlo, y mover al niño en su lugar
  3. un nodo con dos niños: intercambiar ya sea con su predecesor en orden o sucesor, y luego retirarlo

La página wiki contiene un ejemplo de cómo esto podría buscar en el código.

O como un ejemplo muy básico 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);
}
Respondida el 30/09/2011 a las 06:18
fuente por usuario

votos
2

No entiendo muy bien el protocolo utilizado para la eliminación de aquí. Parece que no tiene un árbol binario 'busca' (hay orden en el árbol).

Pero apenas hacer el código simple. Se podría hacer algo como esto:

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

También, se debe utilizar borrar para evitar pérdidas de memoria aquí. Espero que ayude.

Respondida el 30/09/2011 a las 06:33
fuente por usuario

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