0

二分式ツリーを評価したい。これは私がこれまで集めてきたコードです。ツリーを評価しながら、ツリーのノードを破壊しています。しかし問題は、再帰中に、持っていないデータを探すことだと思います。単に 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;
};
4

1 に答える 1

2

機能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オブジェクトが削除されないため、メモリ リークも発生します。

于 2013-09-01T17:30:38.077 に答える