Created
June 18, 2015 19:58
-
-
Save nathan-cruz77/11a5d7136dd7921e8886 to your computer and use it in GitHub Desktop.
Funcao de remocao em arvore de busca binaria
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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