• 0
Sign in to follow this  
Wagner da Silva

Arvore binaria com expressão numerica

Question

Olá construí este código em arvore binaria mas, está dando erro , apenas preciso fazê-lo apresentar um resultado, que é o numeral 20. alguém poderia me ajudar.

#include <stdio.h>

typedef struct arv Arv;
struct arv {
    char op;
    float valor;
struct arv *esq, *dir;

};

// Implementar esta função
float avalia (Arv *a)
{

if ((a->esq == NULL) && (a->dir == NULL))
return a->valor;
else{

  if(a->op == ‘+’) return avalia(a->esq) + avalia(a->dir)
  if(a->op == ‘-’) return avalia(a->esq) - avalia(a->dir)
  if(a->op == ‘*’) return avalia(a->esq) * avalia(a->dir)
  if(a->op == ‘/’) return avalia(a->esq) / avalia(a->dir)
       }


}

int main(void)
{
    // Árvore para representar a operação: 5 * 3= 15
    Arv no[3];           // Em vetor
    Arv op, val1, val2;  // Em variáveis

    // Vetor
    no[0].op = '*';
    no[0].esq = &no[1];
    no[0].dir = &no[2];

    no[1].valor    = 5;
    no[2].valor    = 3;

    printf("Resultado da expressao: %.2f\n", avalia(&no[0]));

    // Variáveis
    op.op = '*';
    op.esq = &val1;
    op.dir = &val2;

    val1.valor  = 5;
    val2.valor  = 3;

    printf("Resultado da expressao: %.2f\n", avalia(&op));
}

 

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Pra quem queira  saber o resultado desse código, está aqui.

Elabore um programa em linguagem C que faça a leitura da árvore binária abaixo, executando as expressões aritméticas e imprimindo na tela o resultado do cálculo efetuado. O resultado retornado pela expressão definida na árvore abaixo é o valor 20.

#include <stdio.h>

typedef struct ARVORE {
    char operador;
    float valor;
    struct ARVORE *esquerda;
    struct ARVORE *direita;
} arvore;


float avalia(arvore *a)
{
    float x,y,res;

    // Se os ramos esquerdo e direito forem terminais, então o nodo contém um valor
    // Retornar esse valor
    if (a->esquerda == NULL && a->direita == NULL) {
        return a->valor;
    }
    else {
       

 // Senão, isto é, se os ramos esquerdo e direito não forem terminais, então o nodo contém um operador
        // Retornar recursivamente o resultado da operação requerida pelo nodo

        x = avalia(a->esquerda);
        y = avalia(a->direita);
        switch (a->operador) {
            case '+': res = x + y; break;
            case '-': res = x - y; break;
            case '*': res = x * y; break;
            case '/': res = x / y; break;
        }
        return res;
    }
}

int main()
{
    arvore nodo[9] = {
                        {'+',0,&nodo[1],&nodo[2]},
                        {'*',0,&nodo[3],&nodo[4]},    
                        {' ',5,NULL,NULL},            
                        {'-',0,&nodo[5],&nodo[6]},
                        {'+',0,&nodo[7],&nodo[8]},
                        {' ',6,NULL,NULL},
                        {' ',3,NULL,NULL},
                        {' ',4,NULL,NULL},
                        {' ',1,NULL,NULL}
                     };
    
    float resultado;
    resultado = avalia(&nodo[0]);
    printf("Resultado = %2.0f\n",resultado);
}
 

 

QUE_33524_138964_1.jpg

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this