コード例 #1
0
/*
 * 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);
}
コード例 #2
0
// 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);
}
コード例 #3
0
/*
 * 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;

}
コード例 #4
0
// 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);
}