Рекурсивно создать дерево

0

Я пытаюсь рекурсивно создать дерево выражений. Всякий раз, когда эта функция получает другие переменные выражения, она работает отлично. Но всякий раз, когда он получает целое число (или в этом случае строку, которое принимает его в оператор else), он вызывает сбой моей программы.

     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 - корень дерева (который является null при передаче этой функции), а ins - это объект потока входных файлов.

Теги:
recursion
expression-trees

1 ответ

1
Лучший ответ

Извините, что он не работает нормально, есть несколько ошибок

в первую очередь

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

должно быть

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

Запятая не работает, как вы ожидаете.

Во-вторых, если вы хотите создать свое дерево, вы должны вернуть указатель из функции, а не передать указатель на функцию. Как это

 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;
}

Это, по-видимому, очень распространенное непонимание того, как работают указатели при передаче функции. Если вы передадите указатель на функцию, вы можете использовать ее для изменения того, на что указывает вызывающая функция, вы не можете использовать ее для изменения самого указателя в вызывающей функции.

  • 0
    Понимаю. Не могли бы вы передать указатель по ссылке, чтобы напрямую изменить его? Также спасибо за помощь!
  • 1
    @ user2754048 Это было бы альтернативой, хотя я думаю, что использование возвращаемого значения - лучший стиль.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню