• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

suzy

funcao recursiva

6 mensagens neste tópico

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?? :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Essa tua função não está lá muito bem  :D 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 ;)

     

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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?  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora