Я должен оценивать постфиксное выражение, используя дерево выражений. Предположим, у меня есть дерево, подобное этому
-
/ \
+ *
/ \ / \
a b c d
Сначала мне нужно оценить поддерево + b и сохранить его результат в + узле, затем c * d и так далее, пока я не получу результат в корневом узле.
Я попробовал рекурсивный подход, используя стек, но это не сработало. Псевдокод выглядел так
Однако это не сработало. Я также должен показать дерево на каждом шаге, чтобы показать уменьшающиеся узлы. Я много раз искал его, но я не смог найти нужный ответ. Кто-нибудь, пожалуйста, помогите мне, как это сделать.
void expression_tree::evaluate(node *temp)
{
if(!temp)
return;
/// stack_postfix obj;
stack_postfix obj2;
evaluate(temp->left);
evaluate(temp->right);
if(temp->right == NULL && temp->left == NULL)
{
obj2.push(temp);
}
else
{
node * a = obj2.pop();
node *b = obj2.pop();
temp->value = a->value + b->value;
delete a;
delete b;
}
}
у вас есть 2 варианта:
eval листа:
1 - просто нажмите значение для стека
eval of non_leaf:
1 - eval left, - ПОМНИТЕ: результат eval добавлен в стек.
2 - справа,
3 - поп 2 предмета,
4 - расчет,
5 - нажмите результат.
в конце у вас будет 1 элемент в стеке - последний результат
РЕДАКТИРОВАТЬ:
void expression_tree::evaluate(node *temp, stack& s)
{
if(!temp)
return;
if(temp->left != NULL && temp->right != NULL){
//only 1 pointer is illegal!
evaluate(temp->left);
evaluate(temp->right);
node* n2 = s.pop();
node* n1 = s.pop();
//in the stack should be only leaves
temp->value = n1->value + n2->value;//use switch by operator
delete temp->left;
temp->left = NULL;
delete temp->right;
temp->right=NULL;
}
s.push (temp);
}
Вы забыли obj2.push(temp->balue);
в другой части
Однако, есть больше ошибок, стек должен быть разделен между вызовами функций, поэтому функция может фактически обработать его