/* * Busca o no a ser removida da arvore */ no *busca_remove (no *x, char *chave) { if (!x) //Se nao existir arvore, retorna NULL return NULL; if (strcmp (chave, x -> chave) == 0) //Se existir o no com a chave desejada, retorna o no return x; if (strcmp (chave, x -> chave) == -1) //Procura a chave recursivamente return busca_remove (x -> esq, chave); return busca_remove (x -> dir, chave); }
// busca nó substituto e realiza a remoção (busca o mais à direita do nó esquerdo) struct NO *busca_remove(struct NO *no, struct NO *no_chave, bool h) { struct NO *no_removido; if (no->fdir != NULL) { no->fdir = busca_remove(no->fdir, no_chave, h); if (h) no = balanceamento_dir(no, h); } else { no_chave->info = no->info; no_removido = no; no = no->fesq; if (no != NULL) no->pai = no_removido->pai; h = true; //expande a atualização dos FB free(no_removido); } return(no); }
/* * Remove um no da arvore */ char *rn_remove(arv *t, char *chave) { no *p = malloc(sizeof(no*)); no *y = malloc(sizeof(no*)); no *x = malloc(sizeof(no*)); p = busca_remove(t->raiz, chave); if(!p) return NULL; if((p->esq = t->nil) || (p->dir == t->nil)) y = p; else y = sucessor(p); if(y->esq != t->nil) x = y->esq; else x = y->dir; x->pai = y->pai; if(y->pai == t->nil){ t->raiz = x; } else if(y == y->pai->esq) y->pai->esq = x; else y->pai->dir = x; if(y != p){ strcpy(p->chave, y->chave); strcpy(p->conteudo, y->conteudo); p->pai = y->pai; p->dir = y->dir; p->esq = y->esq; } if(y->cor == BLACK) rn_remove_fixup(t, x); return p->conteudo; }
// remoção da árvore struct NO *remover(struct NO *raiz, int info, bool h) { if (raiz == NULL) { printf("Chave nao encontrada."); h = false; } else { if (raiz->info.chave > info) { //desce pela sub-árvore esquerda raiz->fesq = remover(raiz->fesq, info, h); if (h) raiz = balanceamento_esq(raiz, h); } else if (raiz->info.chave < info) { //desce pela sub-árvore direita raiz->fdir = remover(raiz->fdir, info, h); if (h) raiz = balanceamento_dir(raiz,h); } else { //encontrou o elemento que será removido if (raiz->fdir == NULL) { if (raiz->fesq != NULL) //escolhe o nó à esquerda como substituto raiz->fesq->pai = raiz->pai; raiz = raiz->fesq; h = true; } else if (raiz->fesq == NULL) { if (raiz->fdir != NULL) //escolhe o nó à direita como substituto raiz->fdir->pai = raiz->pai; raiz = raiz->fdir; h = true; } else { // busca o elemento mais à direita do nó esquerdo raiz->fesq = busca_remove(raiz->fesq, raiz, h); //se necessário efetua balanceamento esquerdo, pois a função busca_remove foi para o nó esquerdo if (h) raiz = balanceamento_esq(raiz, h); } } } return(raiz); }