Crea un árbol recursivamente

c++ expression-trees recursion

Pregunta

Estoy tratando de crear recursivamente un árbol de expresiones. Cada vez que esta función recibe otras variables de expresión, se ejecuta perfectamente. Pero cada vez que recibe un entero (o en este caso una cadena que lo lleva a la sentencia else) bloquea mi programa.

     void buildExpressionTree (istream &ins, BinaryNode* p)
     {
         string buffer;

         //read in from file             
         while ((ins.peek()!='\n') && (ins >> buffer))
         {
             if(p == NULL && buffer == "*","/","+","-")
             {
                 p = new BinaryNode(buffer, NULL, NULL);
                 buildExpressionTree(ins,p->left);
                 buildExpressionTree(ins,p->right);
             }
             else 
             {
                 p = new BinaryNode(buffer, NULL, NULL);
             }
        }
      }

p es la raíz del árbol (que es nula cuando se pasa a esta función) e ins es un objeto de secuencia de archivo de entrada.

Respuesta aceptada

Lamento decir que no funciona bien, hay varios errores

en primer lugar

if(p == NULL && buffer == "*","/","+","-")

debiera ser

if(buffer == "*" || buffer == "/" || buffer == "+" || buffer == "-")

La coma no funciona como lo esperas.

En segundo lugar, si desea construir su árbol, debe devolver un puntero desde la función, no pasar un puntero a la función. Me gusta esto

 BinaryNode* buildExpressionTree (istream &ins)
 {
     string buffer;

     //read in from file    
     BinaryNode* p = NULL;
     while ((ins.peek()!='\n') && (ins >> buffer))
     {
         if(buffer == "*" || buffer == "/" || buffer == "+" || buffer == "-")
         {
             p = new BinaryNode(buffer, NULL, NULL);
             p->left = buildExpressionTree(ins);
             p->right = buildExpressionTree(ins);
         }
         else 
         {
             p = new BinaryNode(buffer, NULL, NULL);
         }
    }
    return p;
}

Esto parece ser un malentendido muy común de cómo funcionan los punteros cuando se pasan a una función. Si pasa un puntero a una función, puede usarlo para modificar lo que se está apuntando en la función de llamada, no puede usarlo para modificar el puntero en sí mismo en la función de llamada.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow