Jump to content

funcao recursiva


suzy
 Share

Recommended Posts

Considere a seguinte definição:

struct tree{

int valor;

struct tree *esq, *dir;

};

Escreva uma função recursiva em C que verifique se todos os valores armazenados

numa árvore binária constituída por elementos do tipo struct tree são iguais. A função

recebe como argumento um ponteiro para a raiz da árvore. Devolve 1 se os valores

armazenados forem todos iguais, ou 0 caso não sejam.

int funcao (struct tree *ptr)

    {

    if(ptr==NULL)

    return -1

  else if(ptr->esq->valor==ptr->dir->valor)

  return 1

else

  return 0

}

que acham esta correcto?? ?

Link to comment
Share on other sites

Essa tua função não está lá muito bem  😄 Como já foi dito não é recursiva, para o ser tem de invocar-se no seu corpo. Mesmo em termos de algoritmo não esta correcta, pois só estas a comparar dois nós do mesmo nível. Considera o seguinte exemplo:

    1

  /  \

  2  2

/ \

3  3

Quando estás a fazer a primeira comparação tens de verificar que ValorPai == ValorEsquerda && ValorEsquerda == ValorDireita. Só se verificar estas duas condições podes avançar para as duas sub-arvores (da esquerda e da direita) e é aqui que entra a recursividade. 🙂

Revê o algoritmo e mete aqui para o pessoal ajudar 😉

Daniel Amorim

VP for xRTML

http://www.xrtml.org http://www.realtime.co

Link to comment
Share on other sites

int funcao (struct tree *ptr){

                                              if(*ptr == NULL) return -1;

                                              else if(ptr->valor == ptr->valor->esq &&ptr->valor->esq == ptr->valor->dir) return 1;

                                              else return 0;

                                              funcao(struct tree *ptr);                                             

                                              }

Assim? Por acaso tenho q saber isto bem. Alguém tem teoria sobre isto?  😉

Link to comment
Share on other sites

Isso não está bem por 3 motivos:

- Estás a fazer *ptr==NULL. Mas não precisas do asterisco, pois ptr já é um apontador.

- Estás a fazer: valor->esq e valor->dir. Sendo valor um inteiro e não um apontador, isso vai dar erro. O que queres será esq->valor e dir->valor.

- Não podes fazer return 1 se a comparação for verdadeira, porque se for, tens que invocar a função recursivamente para a sub-árvore esquerda e para a sub-árvore direita.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.