c++ - 二叉表达式树评估

标签 c++

我想评估二叉表达式树。这是我到目前为止收集的代码。当我评估它时,我正在破坏树的节点。但问题是,我认为在递归期间它会寻找它没有的数据。它只是不断地返回 0。

void calc(bnode *&b)
{
    bnode *c;
    int m;
    switch (b->data.ch)
    {
        case '+':m=b->lchild->data.in+b->rchild->data.in;
                 break;
        case '-':m=b->rchild->data.in-b->lchild->data.in;
                 break;
        case '*':m=b->lchild->data.in*b->rchild->data.in;
                 break;
        case '/':m=b->lchild->data.in/b->rchild->data.in;
                 break;
        case '%':m=b->lchild->data.in%b->rchild->data.in;
                 break;
    }

     c=new(bnode);
     c->lchild=NULL;
     c->rchild=NULL;
     c->tag=1;
     c->data.in=m;
     b=c;
}

int eval(bnode *b)
{
    if (b->tag==1)
    return b->data.in;
    else
    {
        if (b->lchild->tag==0)
           eval(b->lchild);
        if (b->rchild->tag==0)
           eval(b->rchild);
        if (b->lchild->tag==1&&b->rchild->tag==1)
           calc(b);
    }
}

而我使用的结构是

union un
{
    int in;
    char ch;
};

struct bnode{
    bnode *lchild;
    un data;
    int tag;
    bnode *rchild;
};

最佳答案

eval() 函数被破坏了。在“else”分支中,您永远不会返回任何值,这是未定义的行为。

[编辑] eval 函数应该改成这样。

int eval(bnode *b)
{
    if (b->lchild && b->lchild->tag == 0)
        eval(b->lchild);
    if (b->rchild && b->rchild->tag == 0)
        eval(b->rchild);
    if (b->lchild && b->rchild && b->lchild->tag == 1 && b->rchild->tag == 1)
        calc(b);

    if (b->tag == 1)
        return b->data.in;
    else
        throw "Evaluation error";
}

你也有内存泄漏,因为 bnode 对象永远不会被删除。

关于c++ - 二叉表达式树评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18560977/

相关文章:

c++ - 在不创建 vector 的情况下检查 Rcpp 中的非有限值

Python - ctypes - 如何调用函数和访问结构字段?

c++ - 如何避免out参数?

c++ - 在 Windows 上以编程方式设置堆栈大小

c++ - 相互使用构造两个类

C++:ofstream 类将文件保存到哪里?

c++ - CMake Ninja Git 自签名证书颁发机构密码提示

c++ - Eigen 无法给出正确的矩阵逆 (c++)

c++ - 有没有什么东西限制 future 的 C++ 标准引入多个返回值?

c++ - 带 float 的零符号