No *remocao(No **paiRaiz, int valorInserido){ if(*paiRaiz == NULL) printf("O valor %d não existe na Arvore\n", valorInserido); else{ if(valorInserido < (*paiRaiz)->numero) remocao(&(*paiRaiz)->esq,valorInserido); else if(valorInserido > (*paiRaiz)->numero) remocao(&(*paiRaiz)->dir,valorInserido); else{ if((*paiRaiz)->esq != NULL){ No *auxiliar = maisDireita(&(*paiRaiz)->esq); (*paiRaiz)->numero = auxiliar->numero; (*paiRaiz)->esq = remocao(&(*paiRaiz)->esq, auxiliar->numero); } else if((*paiRaiz)->dir != NULL){ No *auxiliar = maisEsquerda(&(*paiRaiz)->dir); (*paiRaiz)->numero = auxiliar->numero; (*paiRaiz)->dir = remocao(&(*paiRaiz)->dir, auxiliar->numero); } else{ printf("O valor %d foi removido!\n", (*paiRaiz)->numero); (*paiRaiz) = NULL; } } } return (*paiRaiz); }
void remover_No (ArvBin* arv, int x){ ArvBin* ref = buscar_no(arv, x); if (ref->esq->valor == NULL && (ref->dir->valor == NULL)){ free (ref->valor); ref->valor = NULL; return; } if (ref->esq->valor == NULL){ *ref = *ref->dir; } else if (ref->dir->valor == NULL){ *ref = *ref->esq; } ArvBin* refMaisDireita = maisDireita(ref->esq); *ref->valor = *refMaisDireita->valor; remover_No(arv->esq, *ref->valor); }
ArvBin* maisDireita (ArvBin* arv){ if(arv->dir->valor == NULL) return arv; else return maisDireita(arv->dir); }