Skip to content

Instantly share code, notes, and snippets.

@nathan-cruz77
Created June 18, 2015 19:58
Show Gist options
  • Save nathan-cruz77/11a5d7136dd7921e8886 to your computer and use it in GitHub Desktop.
Save nathan-cruz77/11a5d7136dd7921e8886 to your computer and use it in GitHub Desktop.
Funcao de remocao em arvore de busca binaria
#include <stdlib.h>
#include <stdbool.h>
typedef struct Arv{
int chave;
struct Arv* esq;
struct Arv* dir;
} TArv;
typedef TArv* PArv;
PArv pesquisa(PArv arv, PArv* pai, int x){
if(arv == NULL){
return NULL;
}
else if(arv->chave == x){
return arv;
}
else if(x < arv->chave){
*pai = arv;
return pesquisa(arv->esq, pai, x);
}
else{
*pai = arv;
return pesquisa(arv->dir, pai, x);
}
}
PArv busca_sucessor(PArv arv, PArv* pai){
PArv aux;
for(aux=arv->dir; aux->esq != NULL; aux = aux->esq);
return pesquisa(arv, pai, aux->chave);
}
bool remove_no(PArv* arv, int x){
PArv a_ser_removido, pai_do_removido=NULL;
PArv sucessor, pai_do_sucessor=NULL;
if(*arv == NULL){
return false;
}
a_ser_removido = pesquisa(*arv, &pai_do_removido, x);
if(a_ser_removido == NULL)
return false;
if(a_ser_removido->dir == NULL){
if(a_ser_removido == *arv){
*arv = a_ser_removido->esq;
}
else if(pai_do_removido->dir == a_ser_removido){
pai_do_removido->dir = a_ser_removido->esq;
}
else if(pai_do_removido->esq == a_ser_removido){
pai_do_removido->esq = a_ser_removido->esq;
}
free(a_ser_removido);
return true;
}
else if(a_ser_removido->esq == NULL){
if(a_ser_removido == *arv){
*arv = a_ser_removido->dir;
}
else if(pai_do_removido->dir == a_ser_removido){
pai_do_removido->dir = a_ser_removido->dir;
}
else if(pai_do_removido->esq == a_ser_removido){
pai_do_removido->esq = a_ser_removido->dir;
}
free(a_ser_removido);
return true;
}
else{
sucessor = busca_sucessor(a_ser_removido, &pai_do_sucessor);
a_ser_removido->chave = sucessor->chave;
return remove_no(&(a_ser_removido->dir), sucessor->chave);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment