Ir ao conteúdo
  • Cadastre-se

C Remoção em árvore binária de busca


a.melchiors

Posts recomendados

Estou fazendo um trabalho de aula, de remoção em árvore de busca binária.

Não consigo ver o erro, só sei que retorna (VALOR INVÁLIDO) quando deveria ter sido SUCESSO, imagino que acontece pois a remoção não ocorreu.

 

Abaixo as funções envolvidas.

Alguém consegue me ajudar?

codigo_erro abb_insere      (abb_t* arv, void* data){   
	if (!arv) return INVALIDO;
	if (arv->compara == NULL) return ESTADO_INVALIDO;
	if (arv->raiz == NULL) {
		node_t *no   = (node_t*) malloc(sizeof(node_t));
		no->esquerda = NULL;
		no->direita  = NULL;
		no->info     = data;		
		arv->raiz    = no;
		arv->tamanho++;
		return SUCESSO;
	} 
	if (abb_busca_bin(arv, data)) return DUPLICADO;
	node_t *aux = arv->raiz;
	node_t *pai = NULL;
	while (aux != NULL && aux->info != data) {
		pai = aux;
		if (arv->compara (data, aux->info)==-1) aux = aux->esquerda;
		else aux = aux->direita;
	} 
	node_t *no   = (node_t*) malloc(sizeof(node_t));
	no->esquerda = NULL;
	no->direita  = NULL;
	no->info     = data;	
	if (arv->compara (data, pai->info)==-1) pai->esquerda = no;
	else pai->direita = no;
	arv->tamanho++;
	return SUCESSO;
}
codigo_erro abb_remove      (abb_t* arv, const void* data){   
	if (arv == NULL || arv->raiz == NULL) return UNDER_FLOW;
	if (!data) return VALOR_INVALIDO; 
	if (abb_busca_bin(arv, (void*)data) == 0) return VALOR_INVALIDO;
	rem_rec(&(arv->raiz), data, arv);
	arv->tamanho--;
	return SUCESSO;
}

void rem_rec(node_t **aux, const void* data, abb_t *arv){
    if(aux == NULL)return;
    if(*aux == NULL)return;
   // return;
    if(arv->compara(data, (*aux)->info)==-1) rem_rec(&(*aux)->esquerda, data, arv);
    if(arv->compara(data, (*aux)->info)==1) rem_rec(&(*aux)->direita, data, arv);
    else libera_no(&(*aux),data);
    return;
}

void libera_no(node_t **aux, const void* numero){
    node_t *pai = *aux;
    if ((*aux)->esquerda == NULL && (*aux)->direita == NULL){//folha
        free(pai);
        (*aux) = NULL;
        return;
    }
    if((*aux)->esquerda == NULL){     //só tem filho direito
		*aux=(*aux)->direita;
		free(pai);
		pai=NULL;
		return;
	}
    if ((*aux)->direita == NULL){     //só tem filho esquerdo
        *aux = (*aux)->esquerda;
        free(pai);
        pai = NULL;
        return;
    }
    pai = MenorDireita(&(*aux)->esquerda);  //tem dois filhos
    pai->esquerda = (*aux)->esquerda;
    pai->direita = (*aux)->direita;
    (*aux)->esquerda = NULL;
    (*aux)->direita = NULL;
    free((*aux));  
    *aux = pai;  
    pai = NULL;
    return;
}

node_t *MenorDireita(node_t **noh){
    if((*noh)->direita != NULL) return MenorDireita(&(*noh)->direita);
    node_t *aux = *noh;
    if((*noh)->esquerda != NULL) {
      	*noh = (*noh)->esquerda;
       	return aux;
    }
    *noh = NULL;
	return aux;
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!