Ir ao conteúdo
  • Cadastre-se
Ian Varejao

Inserindo o ultimo elemento na arvore

Recommended Posts

Minha funcao Preenche(arvore **A,int x,int y) insere os elementos de x a y de forma balanceada na arvore.O problema é que o ultimo elemento, y, não está sendo inserido.

A funcao deve ser alterada de forma que este elemento passe a ser inserido mas sem mudar suas propriedades:

.A funcao deve ser recursiva

.A funcao nao pode ter argumentos contadores ou argumentos flags

.A funcao nao pode usar variaveis static

.A funcao nao pode repetir subproblemas (nao pode inserir o mesmo elemento mais de uma vez)

Se alguem tiver alguma ideia responda o post.

código do Preenche():

void Preenche(arvore **A,int x,int y){    if(x<y)    {        int meio= (x+y)/2;        Insere(A,meio);        Preenche(&(*A)->esq,x,meio);        Preenche(&(*A)->dir,meio+1,y);    }}

Código completo do programa:

//Arvore Binaria de Busca (Recursiva)//Headers#include <stdio.h>#include <stdlib.h>//Estrutura de Dadostypedef struct arvore{    int elem;    int N;    struct arvore *esq,*dir;}arvore;//Prototipos //Funcoes essenciais  arvore* Cria(int);  void Destroi(arvore**); //Funcoes de Insercao  void Insere(arvore **,int);  void Preenche(arvore **,int,int); //Funcoes de Remocao  void Remove(arvore **,int); //Funcoes de Percurso  void PreOrdem(arvore*); //Funcoes de Busca  int Existe(arvore*,int);  int Menor(arvore*); //Outras Funcoes  void setN(arvore*);//Funcoes essenciaisarvore* Cria(int x){    arvore *novo=(arvore*) malloc(sizeof(arvore));    novo->elem=x;    novo->N=1;    novo->esq=novo->dir=NULL;}void Destroi(arvore **p){    if(*p != NULL)    {        Destroi(&(*p)->esq);        Destroi(&(*p)->dir);        (*p)->esq=(*p)->dir=NULL;        free(*p);    }}//Funcoes de Insercaovoid Insere(arvore **A,int x){    arvore *p=(*A);    if(p!=NULL)    {        if(p->elem > x)            Insere(&p->esq,x);        else if(p->elem < x)            Insere(&p->dir,x);        else            printf("Elemento já existente!\n");    }    else    {        p=Cria(x);        (*A)=p;    }}void Preenche(arvore **A,int x,int y){    if(x<y)    {        int meio= (x+y)/2;        Insere(A,meio);        Preenche(&(*A)->esq,x,meio);        Preenche(&(*A)->dir,meio+1,y);    }}//Funcoes de Remoçaovoid Remove(arvore **A,int x){    arvore *p=(*A);    if(p!=NULL)    {        if(p->elem != x)        {            if(p->elem > x)                Remove(&p->esq,x);            else                Remove(&p->dir,x);        }        else        {            if(p->esq == p->dir)            {                (*A)=NULL;                free(p);            }            else if(p->esq == NULL)            {                (*A)=p->dir;                free(p);            }            else if(p->dir == NULL)            {                (*A)=p->esq;                free(p);            }            else            {                int y=Menor(p->dir);                Remove(&p->dir,y);                p->elem=y;            }        }    }}            //Funcoes de Percursovoid PreOrdem(arvore *p){    if(p!=NULL)    {        printf("Elemento: %d \tTamanho: %d\n",p->elem,p->N);        PreOrdem(p->esq);        PreOrdem(p->dir);    }}//Funcoes de Buscaint Existe(arvore *p,int x){    if(p!=NULL)    {        int y=p->elem;        if(y!=x)        {            if(y > x)                Existe(p->esq,x);            else                Existe(p->dir,x);        }        else            return 1;    }    else        return 0;}int Menor(arvore *p){    if(p!=NULL)    {        if(p->esq!=NULL)            Menor(p->esq);        else            return p->elem;    }}//Outras Funcoesvoid setN(arvore *p){    if(p!=NULL)    {        if(p->esq != NULL)        {            setN(p->esq);            p->N+=p->esq->N;        }        if(p->dir != NULL)        {            setN(p->dir);            p->N+=p->dir->N;        }    }}            //Funcao Principalint main(){    arvore *A=NULL;    Preenche(&A,1,8);    setN(A);    PreOrdem(A);    Destroi(&A);    return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×