Ej 3 removerABB

Ej 3 removerABB

de Sebastian Piceda Palmieri -
Número de respuestas: 7

hola, mi problema con este ejercicio es cuando quiero borrar un nodo el cual tiene una rama a la izquirda o 1 rama a la derecha, no logro que se saltee el nodo que quiero borrar y pase directamente a la rama,

plantee esta estructura pero no se porque el b parece que no modificara nada, pense que podia hacer que b = b->sig y asi pegaria el "salto" haciendo que el nodo que quiero borrar quede afuera del arbol y en su lugar quede enganchada la rama, pero no se que estoy haciendo mal porque no lo hace, sino que queda el nodo enganchado al arbol igual que antes, y al hacer delete aux, borro el nodo, y dejo a la deriva la rama que deberia haber quedado enganchada donde estaba el nodo, si saben que estoy haciendo mal avisenme

En respuesta a Sebastian Piceda Palmieri

Re: Ej 3 removerABB

de Sebastian Piceda Palmieri -
el resultado que me da cuando ejecuto eso es que donde estaba el nodo que borre, aparece un nodo con un 0 como elemento, y enganchado a ese nodo hay otro con un 1, talvez sea basura que quedo enganchada, pero me parece muy raro
En respuesta a Sebastian Piceda Palmieri

Re: Ej 3 removerABB

de Federico Andrade -
Hola Sebastián,

La idea general que tenés está muy bien, siempre y cuando el puntero al nodo se esté pasando por referencia, este aspecto es fundamental para asegurarte que estás trabajando "encima o montado" a los punteros que conforman el árbol (tendría que ver el cabezal de la función/procedimiento).
El otro problema que tenés es que le estás pasando a removerABB un puntero auxiliar, y no un puntero propio del árbol, lo cual hace que el árbol te quede desconectado.
Finalmente, un detalle es que no es necesario que hagas aux->der = NULL, cuando haces delete del nodo solo elimina el nodo, no elimina nada asociado a sus referencias.

Saludos



En respuesta a Federico Andrade

Re: Ej 3 removerABB

de Mauricio Costanzo Silveira -
Hola ¿cómo están?,

¿Estaría bien lo siguiente?



Saludos,
Mauricio.
En respuesta a Mauricio Costanzo Silveira

Re: Ej 3 removerABB

de Federico Andrade -
Hola Mauricio,

Sería bueno una pregunta más ajustada y que venga de la mano de que lo probaste y te funciona pero algo no te cierra, o lo probaste y no te funciona algún caso y hay algo que querés discutir, o dudas específicas de la implementación.
Si podés hacelo y la seguimos.
Gracias, saludos,
En respuesta a Federico Andrade

Re: Ej 3 removerABB

de Mauricio Costanzo Silveira -
Buenos días Federico, ¿cómo estás?

En la letra del ejercicio se pide ..
"Procedimiento removerMaxABB: que recibe un ABB no vacío b y elimina el elemento de máximo valor en b."

Si el nodo máximo tendría otro árbol en nodoMaximo->izq , esas referencias se perderían. Por esa razón yo "liberé" todo ese árbol y todos los que se desencadenen de él.

Ahora bien, además de borrar el nodo máximo, también tuve que borrar otros nodos y no sé si eso está bien.

En caso de que no:
1 ¿Cuál sería la idea? ¿Redistribuir todos los nodos de nodoMaximo->izq en el árbol general?
2 ¿Hacer un enganche con el nodo anterior al nodoMaximo? Para este último caso Habría que verificar si se sigue cumpliendo que el árbol sea binario de búsqueda ¿Tendrías algún ejemplo de código que cumpliera con ese criterio?

Saludos,
Mauricio.
En respuesta a Mauricio Costanzo Silveira

Re: Ej 3 removerABB

de Carlos Luna -
Hola Maurcio.
Al remover el máximo no deberías borrar los elementos en su subárbol izquierdo, sino estaría borrando más que el máximo del árbol.
Notar que el nodo que tenga al máximo tiene un subárbol derecho vacío (por ser justamente el máximo), pero puede tener un subárbol izquierdo no vacío. Que pasaría entonces si el puntero al nodo con el máximo pasara a referenciar al subárbol izquierdo de éste? Siguiría siendo un ABB el árbol resultante sin el máximo? Obviamente deberías liberar la memoria del nodo que ya no forme parte del árbol.
Saludos, Carlos