Esempio n. 1
0
void InserirAux (ARVORE *arvore, NO *no)
{
    /* Ajusta os NOS segundo suas cores ate estes nao violem nenhuma regra da Arvore Vermelha e Preta */
    while (no->pai->cor == 'v')
    {
        if (no->pai == no->pai->pai->fesq)
        {
            NO *PTR_aux = no->pai->pai->fdir;

            if (PTR_aux->cor == 'v')
            {
                no->pai->cor = 'p';
                PTR_aux->cor = 'p';
                no->pai->pai->cor = 'v';
                no = no->pai->pai;
            }
            else
            {
                /* Caso entre no "if" fara rotaçao dupla */
                if (no == no->pai->fdir)
                {
                    no = no->pai;
                    RotacaoEsquerda (arvore, no);
                }

                no->pai->cor = 'p';
                no->pai->pai->cor = 'v';
                RotacaoDireita (arvore, no->pai->pai);
            }
        }
        else
        {
            NO *PTR_aux = no->pai->pai->fesq;

            if (PTR_aux->cor == 'v')
            {
                no->pai->cor = 'p';
                PTR_aux->cor = 'p';
                no->pai->pai->cor = 'v';
                no = no->pai->pai;
            }
            else
            {
                if (no == no->pai->fesq)
                {
                    no = no->pai;
                    RotacaoDireita (arvore, no);
                }

                no->pai->cor = 'p';
                no->pai->pai->cor = 'v';
                RotacaoEsquerda (arvore, no->pai->pai);
            }
        }
    }

    arvore->raiz->cor = 'p';
}
Esempio n. 2
0
void AlgoritmoDSW(Apontador *Dicionario)
	{  Apontador *p;  int nodecount; int i;
	
	for((*p)=Dicionario,nodecount=0;(*p)!=0;(*p)=(*p)->Dir,++nodecount)
		{
		while(RotacaoDireita(p)==1) { }
		}

	for(i=nodecount/2; i>0; i/=2 )
		{  int k;
		for((*p)=Dicionario,k=0;k<i;++k,(*p)=(*p)->Dir)
			{ RotacaoEsquerda(p);  }
		}
	}
Esempio n. 3
0
void RemoverAux(ARVORE *arvore, NO *aux)
{
    NO *aux_irm;

    /* Similarmente a Inserir, percorre a ARVORE em busca de incosistencias */
    while (aux->cor == 'p' && aux != arvore->raiz)
    {
        if (aux == aux->pai->fesq)
        {
            aux_irm = aux->pai->fdir;
            if (aux_irm->cor == 'v')
            {
                aux_irm->cor = 'p';
                aux->pai->cor = 'v';
                RotacaoEsquerda(arvore, aux->pai);
                aux_irm = aux->pai->fdir;
            }
            if (aux_irm->fdir->cor == 'p' && aux_irm->fesq->cor == 'p')
            {
                aux_irm->cor = 'v';
                aux = aux->pai;
            }
            else
            {
                if (aux_irm->fdir->cor == 'p')
                {
                    aux_irm->fesq->cor = 'p';
                    RotacaoDireita(arvore, aux_irm);
                    aux_irm = aux->pai->fdir;
                }
                aux_irm->cor = aux->pai->cor;
                aux->pai->cor = 'p';
                aux_irm->fdir->cor = 'p';
                RotacaoEsquerda(arvore, aux->pai);
                aux = arvore->raiz;
            }
        }
        else
        {
            aux_irm = aux->pai->fesq;
            if ( aux_irm->cor == 'v')
            {
                aux_irm->cor = 'p';
                aux->pai->cor = 'v';
                RotacaoDireita(arvore, aux->pai);
                aux_irm = aux->pai->fesq;
            }
            if ( aux_irm->fdir->cor == 'p' && aux_irm->fesq->cor == 'p')
            {
                aux_irm->cor = 'v';
                aux = aux->pai;
            }
            else
            {
                if ( aux_irm->fesq->cor == 'p')
                {
                    aux_irm->fdir->cor = 'p';
                    RotacaoEsquerda(arvore, aux_irm);
                    aux_irm = aux->pai->fesq;
                }
                aux_irm->cor = aux->pai->cor;
                aux->pai->cor = 'p';
                aux_irm->fdir->cor = 'p';
                RotacaoDireita(arvore, aux->pai);
                aux = arvore->raiz;
            }
        }
    }

    aux->cor = 'p';
}