# arbol binario (en C) que ingrese, elimine y liste datos



## electronacho (Jul 19, 2011)

Tengo un problema para la eliminación de datos, depende que dato elimine me lo raliza bien o no. Les dejo el codigo adjunto. El programa esta corrido en devC++. Cualquier cosa que no se entienda lo que necesito, o que no salga bien el adjunto, por favor avisenme. Desde ya muchas gracias.


----------



## Unikfriend (Jul 19, 2011)

electronacho dijo:


> Tengo un problema para la eliminación de datos, depende que dato elimine me lo raliza bien o no. Les dejo el codigo adjunto. El programa esta corrido en devC++. Cualquier cosa que no se entienda lo que necesito, o que no salga bien el adjunto, por favor avisenme. Desde ya muchas gracias.


 
hi electro,
puedes explicar con que datos los prueba?


----------



## electronacho (Jul 19, 2011)

Ahi te adjunto un ejemplo, es una pantalla del programa. 
Ingrese 5-6-2-89-87-56-1000(el 1000 es para cortar el ingreso) y cuando quise borrar el 6 me sale ese error


----------



## MerLiNz (Jul 19, 2011)

he visto esto:

void imprime(struct arbol *p)
{
if(p->izq!=0)
imprime(p->izq);
printf("==> %d\n",p->dato);
if(p->der!=0)
imprime(p->der);
}

llamas a la funcion dentro de la funcion??


----------



## dukex (Jul 19, 2011)

MerLiNz dijo:


> he visto esto:
> 
> void imprime(struct arbol *p)
> {
> ...



debe ser recursividad..


----------



## MerLiNz (Jul 19, 2011)

Si, es curioso, nunca pense que se podia hacer, traducido a asm simplemente sera un salto, pero no sabia que en C++ el compilador lo permitia.


----------



## dukex (Jul 20, 2011)

MerLiNz dijo:


> Si, es curioso, nunca pense que se podia hacer, traducido a asm simplemente sera un salto, pero no sabia que en C++ el compilador lo permitia.



No sé que conllevará la función, pero creo que no es sólo un salto......  es también conservar una instancia de la función en la memoria como si fuera un objeto existiendo hasta que la funcion empiece a retornar dentro de sí misma, también de manera recursiva...


----------



## MerLiNz (Jul 20, 2011)

yo mas bien diria que seria como hacer un bucle, es decir, mientras existan datos en el puntero ya sea p->izq o p->der se vuelve al inicio de la funcion, una vez no hay datos en los punteros el programa continua.

Como tu dices se llama recursividad, pero al fin y al cabo no deja de ser un bucle. Con el salto me referia a asm, osea un call a una nueva instancia de la funcion.


----------



## electronacho (Jul 20, 2011)

Sí, es recursividad. De todas formas no me hace problema por eso el programa, lo que no logro es que me elimine todos los nodos de la misma forma. Algunos los elimina sin problema y en otros me da ese error que adjunté.


----------



## Unikfriend (Jul 20, 2011)

Hi nacho,
¡Es algo complicado  y entretenido a la vez! jijii
Tuve que agregar varias validaciones por que genera algunos errores
cuando se intenta borrar punteros que no existe y cuando se intentaba
borrar la raiz.


----------



## electronacho (Jul 20, 2011)

Hola Unikfriend!
Lo solucionaste, barbaro! Pero me podrías mandar el código para ver como te quedó??


----------



## Unikfriend (Jul 22, 2011)

electronacho dijo:


> Hola Unikfriend!
> Lo solucionaste, barbaro! Pero me podrías mandar el código para ver como te quedó??


 
Hola nacho, aqui esta el programa

Una disculpa, se me olvido subirlo y ayer estuve enferma.
lo he provado con pocos datos pero creo que trabaja bien.
si encuentras algo que se  pueda mejorar avisame.


Ver la direccion en memoria de cada valor es de mucha ayuda.


----------



## electronacho (Jul 23, 2011)

Muchisimas gracias Unikfriend! incluso lo dejaste más completo al programa, gracias de nuevo, nos vemos


----------



## dukex (Jul 23, 2011)

Já! le debés electronacho, te salvó  y te dió bono!!! 

mucha suerte con todo.

saludos


----------

