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

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

0

Решение

Сожалею, что не работает нормально, есть несколько ошибок

во-первых

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]