C ++ vinculado árbol de búsqueda binaria (DeleteTree)

votos
0

Tengo que poner en práctica un árbol binario de búsqueda usando C ++ para una de las tareas. He creado la clase, y el tratado de aplicar las InsertItem, PrintTree, DeleteTree métodos para la clase, creo que lo hice todo bien pero por alguna razón mi programa sigue fallando :(

Aquí está mi código:

Método PrintTree

template <class TItem>
void BinarySearchTree<TItem>::PrintTree()
{
    PrintTree(RootNode);
}

template <class TItem>
void BinarySearchTree<TItem>::PrintTree(BinarySearchTreeNode* Node)
{
    if(Node == NULL)
        return;

    cout << Node->Data << endl;
    PrintTree(Node->LeftChild);
    PrintTree(Node->RightChild);
}

Método DeleteTree

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree()
{
    DeleteTree(RootNode);
}

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode* Node)
{
    if(Node == NULL)
        return;

    DeleteTree(Node->LeftChild);
    DeleteTree(Node->RightChild);

    delete Node;
}

Mi secuencia de llamadas a métodos hasta que el programa se bloquea:

Insertar elementos F,B,G,A,D,I,C,E,H: funciona bien

Me llamo PrintTree(): funciona bien

Me llamo DeleteTree(): funciona bien

Llamo PrintTree()de nuevo: programa se bloquea

Por alguna razón, la expresión if(RootNode == NULL)no devuelve cierto después de que el DeleteTree()método se llama, por lo que el programa intenta imprimir algo que no existe y se estrella. No estoy seguro de por qué ocurre esto, ¿qué estoy haciendo mal aquí?

Cualquier y toda ayuda es apreciada.

Publicado el 07/11/2011 a las 23:16
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

Llamando a "borrar" no nulo a cabo el puntero. Usted tendrá que hacer:

delete Node; 
Node = nullptr;

EDITAR:

Pasar el puntero por la dirección para que pueda limpiar colgando punteros a medida que avanza:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Respondida el 07/11/2011 a las 23:20
fuente por usuario

votos
2

Creo que la función de eliminación se debe cambiar a la siguiente,

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode** Node)
{
    if((*Node) == NULL)
        return;

    DeleteTree(&(*Node)->LeftChild);
    DeleteTree(&(*Node)->RightChild);

    delete (*Node);
    (*Node) = NULL;
}

Por favor, corríjame si estoy equivocado.

Respondida el 07/11/2011 a las 23:28
fuente por usuario

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