Un problema que tienes es que no actualizas el arbol al eliminar los nodos.
Por ejemplo:
haces el delete... ok... pero "p" sigue apuntando a una dirección... solo que no es válida.
Deberías pasar un puntero doble a esa función para poder hacer algo tal que:
El problema es que el código no se puede probar porque el código que has pasado está incompleto.
Más cosillas:
Usar variables sin inicializar directamente en un bucle??? mala idea, quizás debieras plantearte un bucle do-while e inicializar "actual" y "detras" a nullptr ( nullptr es nuevo en el estandard C++11 y viene a sustituir a NULL.
Y en cuanto a errores, así a simple vista veo esos. El diseño de la clase ArbolBinario deja que desear... si todos los métodos van a ser públicos no se qué sentido tiene crear una clase... pero eso no afecta al funcionamiento del programa.
Por ejemplo:
Código (c) [Seleccionar]
void ArbolBinario::cortarNodo(Nodo *q, Nodo *p){
//Si el nodo a eliminar es una hoja, se borra sin problemas.
if(p->izquierdo == NULL && p->derecho == NULL){
delete p;
return;
}
// ...
}
haces el delete... ok... pero "p" sigue apuntando a una dirección... solo que no es válida.
Deberías pasar un puntero doble a esa función para poder hacer algo tal que:
Código (c) [Seleccionar]
void ArbolBinario::cortarNodo(Nodo *q, Nodo **p){
//Si el nodo a eliminar es una hoja, se borra sin problemas.
if((*p)->izquierdo == NULL && (*p)->derecho == NULL){
delete *p;
*p = NULL;
return;
}
// ...
}
El problema es que el código no se puede probar porque el código que has pasado está incompleto.
Más cosillas:
Código (cpp) [Seleccionar]
Nodo *actual;
Nodo *detras;
while(actual != NULL){
Usar variables sin inicializar directamente en un bucle??? mala idea, quizás debieras plantearte un bucle do-while e inicializar "actual" y "detras" a nullptr ( nullptr es nuevo en el estandard C++11 y viene a sustituir a NULL.
Y en cuanto a errores, así a simple vista veo esos. El diseño de la clase ArbolBinario deja que desear... si todos los métodos van a ser públicos no se qué sentido tiene crear una clase... pero eso no afecta al funcionamiento del programa.