2013-09-01 5 views
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; 
}; 
+1

어떤 일이 발생했는지 더 자세히 설명해 주시겠습니까? – dzada

답변

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 개체가 삭제되지 않기 때문에 메모리 누수가 발생했습니다.

+0

그럼 어떻게해야할까요? 나는 거기에서 무엇을 돌려야하는지 모른다. 0을 반환해야합니까? –

+1

필요한 행동을 직접 결정해야합니다. 두려워요. – sehe