我应该使用表达式树来评估后缀表达式。假设我有一棵这样的树
-
/ \
+ *
/ \ / \
a b c d
我首先需要评估一个+ b子树并将其结果存储在+节点中,然后存储c * d,依此类推,直到我将结果存储在根节点中。
我尝试使用堆栈的递归方法,但这不起作用。伪代码看起来像这样
然而这不起作用。我还必须在每一步显示树,以显示减少的节点。 我用Google搜索了很多次,但我找不到所需的答案。 任何人都可以帮我解决这个问题。
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;
}
}
答案 0 :(得分:1)
您忘记了其他部分的obj2.push(temp->balue);
但是,有更多的错误,堆栈需要在函数调用之间共享,所以函数实际上可以处理它
答案 1 :(得分:0)
你有两个选择:
叶子的评估:
1 - 只需将值推到堆栈
non_leaf的评估:
1 - eval left, - 记住:eval结果已添加到堆栈中。
2 - eval right,
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);
}