我在使用此评估函数时遇到了一些问题,没有指针作为参数。
这里是班级定义:
class ExpressionTree
{
private:
double data; // Used for leaf nodes only.
char operation; // Used for non-leaf nodes only.
ExpressionTree *left; // Will be NULL for a leaf.
ExpressionTree *right; // Will be NULL for a leaf.
};
如您所见,表达式树的left
和right
子树只有指针。
这是我尝试evaluate()
函数(注意没有指针作为参数传递)
double ExpressionTree::evaluate() const {
if(left != NULL && right != NULL) {
double val;
double left_val = left->data;
double right_val = right->data;
if(operation == '+') val = left->evaluate() + right->evaluate();
else if(operation == '*') val = left->evaluate() + right->evaluate();
else val = this->data;
return val;
}
else {
return data;
}
}
在针对此代码运行时,我收到了分段错误:
ExpressionTree buildComplex() {
double x, y, z;
cout << "enter three double values, x, then y, then z\n";
cin >> x >> y >> z;
ExpressionTree ex(x), ey(y), ez(z), e2(2),
yz = ey * ez,
y2 = e2 * ey,
sum1 = ex + yz,
full = sum1 + y2;
return full;
}
void test4() {
cout << "test4: construct and evaluate more complex\n";
ExpressionTree e = buildComplex();
cout << "x + y * z + 2 * y = " << e.evaluate() << endl;
}
我认为分段错误来自evaluate()
函数中的递归调用。
我要问的问题是:如何在没有将节点作为参数传递给函数的情况下递归计算树?我能理解根节点下面是否只有一层,但是会有多层,我不明白如何解决所有其他层。
谢谢!
答案 0 :(得分:3)
您在同一节点上调用evaluate
,创建一个无限循环。
如果要在子表达式上调用它,请使用left->evaluate()
。
可能存在更多问题,我注意到的是这个问题:
else if(right != NULL)
这是没有道理的,只是因为left
不是NULL
你会忽略正确的子表达式吗?
答案 1 :(得分:0)
您的evaluate()
方法无稽之谈。看起来应该是这样的:
double ExpressionTree::evaluate() const
{
if (left != NULL && right != NULL)
{
switch (operation)
{
case '+':
return left->evaluate()+right->evaluate();
case '-':
// remaining operators left as an exercise for the reader
// ....
}
}
// I'm assuming there are only binary operators,
// but if you have unary operators, i.e. unary '-', it's a simple
// extension of what's here
return data;
}