我想评估二进制表达式树。这是我到目前为止所编写的代码。我正在评估它时,我正在销毁树的节点。但问题是,在递归期间,它会查找它没有的数据,我想。它只是继续返回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;
};
答案 0 :(得分: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
个对象。