Diferencia entre dos algoritmos recursivos para eliminar un árbol de búsqueda binaria

votos
0

Tengo una pregunta acerca de estos dos algoritmos:

Esto funciona con normalidad:

node* deleteTree(node* root)
{
    if(root != NULL)
    {
       deleteTree(root->left);
       deleteTree(root->right);
       deallocateNode(root);
    }
    return root=NULL;
}

Este nop:

void deleteTree(node* root)
{
   if(root != NULL)
   {
      deleteTree(root->left);
      deleteTree(root->right);
      deallocateNode(root);
   }
   root=NULL;
}

¿Por qué? Necesito fijar el roota nulllo que el puntero del nodo después de la eliminación de la BST no hará referencia a una memoria no asignada. Yo prefiero el segundo algoritmo debido a que la recuperación de la función es más intuitivo.

En teoría, los dos algoritmos son equivalentes, pero si uso el segundo algoritmo y trato de imprimir el BST, el programa va en un bucle.

Publicado el 14/04/2017 a las 08:35
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
2

Cuando tienes node *rooty asignar node = NULLque no afectará a su valor en el exterior. Si desea modificar el valor del puntero, que tendrá que pasar un doble puntero.

Algo como:

void deleteTree(node** root)
{
   if(*root != NULL)
   {
      deleteTree(&((*root)->left));
      deleteTree(&((*root)->right));
      deallocateNode(*root);
   }
   *root = NULL;
}

Pero yo no creo realmente que es necesario asignar node = NULLya que liberarlo. Por lo tanto, sólo puede asignar node = NULLdespués de llamar deleteTree y usted no tendrá que meterse con doble puntero.

Respondida el 14/04/2017 a las 08:47
fuente por usuario

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