Arboles Binarios en C(Construcción Re cursiva)

Iniciado por NericSain, 30 Mayo 2018, 00:31 AM

0 Miembros y 1 Visitante están viendo este tema.

NericSain

HOLA AMIGOS, HACE UNOS DIAS SUBI MI PROBLEMA DE ARBOLES BINARIOS, PERO CREO QUE NO PUDE EXPLICARME BIEN, ESPERABA QUE ESTA VEZ ALGUIEN EN ESTE BASTO MUNDO DEL INTERWEB, PUDIERA AYUDARME, PUES ESTE EJERCICIO YA ME TIRO TODA UNA SEMANA DE TRABAJO SIN PODER RESOLVERLO. ESTE ES UN ALGORITMO ESCRITO QUE EN TEORÍA DESCRIBE COMO SERA LA FUNCIÓN QUE HAGA LA CONSTRUCCIÓN(NO BÚSQUEDA, NI IMPRESIÓN...ETC), SINO CONSTRUCCIÓN DE UN ÁRBOL DE EXPRESIONES
https://ibb.co/fFOsvy


ESPERO ALGUIEN ME PUEDA AYUDAR


PDT, YA ESCRIBI CODIGO, PERO SE ME DETIENE, EL PROGRAMA O SI MODIIFCO NO ME IMPRIME BIEN EL ARBOL


srWhiteSkull

#1
Pero no pone en lo que muestras que debas usar recursividad para la creación del árbol, sólo te indica el proceso para crearlo y eso puedes hacerlo con una simple iteración (un bucle) y funciones para gestionar el árbol, en las que si podrías usar recursión.

Así por lo primero que leo, los dos primeros puntos, entiendo que cada vez que se crea un nodo, izquierdo o derecho, este se agrega a una pila, que podría ser perfectamente usando un vector(un objeto de c++), por medio de la función push. Luego este puntero, por lo que entendí, se usa para el campo de valor del nodo y se hace un pop una vez se extrae del vector o pila, pero sólo es extraído cuando en el recorrido de la cadena, la que contiene la operación "(9+8...)" encuentra un operador... operador aritmético me imagino, o sea un + * / o lo que sea...

En resumen, mejor usa un bucle y recorre la fórmula carácter a carácter y según el carácter  pues sigues las reglas del ejercicio, como por ejemplo si es un paréntesis derecho o un espacio blanco no hacer nada.

Aunque el ejercicio no tenga ninguna funcionalidad o utilidad práctica, quien vaya a evaluarlo querrá ver un árbol que se ajuste a las reglas del ejercicio.

Y ya para acabar, si no consigues mostrar el árbol completamente es sencillamente porque no has entendido el ejemplo que te puse, que la verdad lo hice lo más sencillo posible para que pudieras entenderlo. La función recursiva simplemente es una de las muchas formas de recorrer un árbol pero con la ventaja de no pasar por el mismo nodo dos veces a costa de comer muchos recursos, pero también puedes usar un bucle e ir creando un mapa para evitar repetir la misma ramificación y saltarte los nodos ya visitados.

Eso si, no espere que te resolvamos el ejercicio con código, sólo te podemos orientar. Si en verdad te gusta la programación y esperas ser un gran programador seguro que lo consigues, y de seguro sentirás una gran satisfacción personal y te ayudará a solucionar en un futuro grandes desafíos algorítmicos. Así que ánimo, si te cuesta comprenderlo haz un dibujo, simula las operaciones con trazas en papel y crea los nodos (como si estuvieras depurando), intenta visualizarlo para que lo comprendas mejor, yo uso esta técnica en algoritmos muy enrevesados.

PD Acuérdate de amputar o podar los nodos cada vez que hagas uno nuevo (con NULL), de esa forma al recorrerlo sabrás donde acaba y además si no lo haces la aplicación puede romperse, porque cuando trabajas con memoria a bajo nivel como en C++ los punteros siempre están sucios y debes gestionarlos tú.