评估表达式树 - C ++

时间:2015-12-02 23:24:36

标签: c++ tree

我在使用此评估函数时遇到了一些问题,没有指针作为参数。

这里是班级定义:

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

如您所见,表达式树的leftright子树只有指针。

这是我尝试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()函数中的递归调用。

我要问的问题是:如何在没有将节点作为参数传递给函数的情况下递归计算树?我能理解根节点下面是否只有一层,但是会有多层,我不明白如何解决所有其他层。

谢谢!

2 个答案:

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