Ejemplo n.º 1
0
        protected No Rotacionar(No no)
        {
            No retorno = null;
            No avo     = no.Pai.Pai;
            No pai     = no.Pai;

            //Rotacao simples a direita
            if (no.EFilhoEsquerdo() && pai.EFilhoEsquerdo())
            {
                retorno = no.Pai;
                avo.Cor = No.CorRubroNegra.Rubro;
                pai.Cor = No.CorRubroNegra.Negro;

                RotacaoSimplesDireita(avo);
                this.OnMensagem(no, "Rotacao simples a direita");
            }
            //Rotacao simples a esquerda
            else if (no.EFilhoDireito() && pai.EFilhoDireito())
            {
                retorno = no.Pai;
                avo.Cor = No.CorRubroNegra.Rubro;
                pai.Cor = No.CorRubroNegra.Negro;

                RotacaoSimplesEsquerda(avo);
                this.OnMensagem(no, "Rotacao simples a esquerda");
            }
            //Rotacao dupla esquerda
            else if (pai.EFilhoDireito())
            {
                retorno = no;
                avo.Cor = No.CorRubroNegra.Rubro;
                no.Cor  = No.CorRubroNegra.Negro;

                RotacaoDuplaEsquerda(avo);
                this.OnMensagem(no, "Rotacao dupla esquerda");
            }
            //Rotacao dupla direita
            else
            {
                retorno = no;
                avo.Cor = No.CorRubroNegra.Rubro;
                no.Cor  = No.CorRubroNegra.Negro;

                RotacaoDuplaDireita(avo);
                this.OnMensagem(no, "Rotacao dupla direita");
            }

            return(retorno);
        }
Ejemplo n.º 2
0
        public void Situacao3(No no)
        {
            //caso 1
            if (no.Irmao.Cor.Equals(No.CorRubroNegra.Rubro))
            {
                base.OnMensagem(no, "Situação: Caso 1");
                if (no.Irmao.EFilhoDireito())
                {
                    no.Irmao.Cor = No.CorRubroNegra.Negro;
                    if (!no.Pai.ERaiz())
                    {
                        no.Pai.Cor = No.CorRubroNegra.Rubro;
                    }

                    base.RotacaoSimplesEsquerda(no.Pai);
                    this.Situacao3(no);
                }
            }
            //caso 2B
            else if (no.Pai.Cor.Equals(No.CorRubroNegra.Rubro))
            {
                base.OnMensagem(no, "Situação: Caso 2B");
                no.Pai.Cor   = No.CorRubroNegra.Negro;
                no.Irmao.Cor = No.CorRubroNegra.Rubro;
            }
            //caso 3 para no esquerdo
            else if (no.EFilhoEsquerdo() && no.Irmao.FilhoEsquerdo.Cor.Equals(No.CorRubroNegra.Rubro) && no.Irmao.FilhoDireito.Cor.Equals(No.CorRubroNegra.Negro))
            {
                base.OnMensagem(no, "Situação: Caso 3(Esquerdo)");
                no.Irmao.FilhoEsquerdo.Cor = No.CorRubroNegra.Negro;
                no.Irmao.Cor = No.CorRubroNegra.Rubro;
                base.RotacaoSimplesDireita(no.Irmao);
                this.Situacao3(no);
            }
            //caso 3 para no direito (espelhado)
            else if (no.EFilhoEsquerdo() && no.Irmao.FilhoDireito.Cor.Equals(No.CorRubroNegra.Rubro) && no.Irmao.FilhoEsquerdo.Cor.Equals(No.CorRubroNegra.Negro))
            {
                base.OnMensagem(no, "Situação: Caso 3(Direito)");
                no.Irmao.FilhoDireito.Cor = No.CorRubroNegra.Negro;
                no.Irmao.Cor = No.CorRubroNegra.Rubro;
                base.RotacaoSimplesEsquerda(no.Irmao);
                this.Situacao3(no);
            }
            //caso 4 para no esquerdo
            else if (no.EFilhoEsquerdo() && no.Irmao.FilhoDireito.Cor.Equals(No.CorRubroNegra.Rubro))
            {
                base.OnMensagem(no, "Situação: Caso 4(Esquerdo)");
                no.Irmao.Cor = no.Pai.Cor;
                no.Pai.Cor   = No.CorRubroNegra.Negro;
                no.Irmao.FilhoDireito.Cor = No.CorRubroNegra.Negro;
                base.RotacaoSimplesEsquerda(no.Pai);
            }
            //caso 4 para no direito (espelhado)
            else if (no.EFilhoDireito() && no.Irmao.FilhoEsquerdo.Cor.Equals(No.CorRubroNegra.Rubro))
            {
                base.OnMensagem(no, "Situação: Caso 4(Direito)");
                no.Irmao.Cor = no.Pai.Cor;
                no.Pai.Cor   = No.CorRubroNegra.Negro;
                no.Irmao.FilhoEsquerdo.Cor = No.CorRubroNegra.Negro;
                base.RotacaoSimplesDireita(no.Pai);
            }
            //caso 2A
            else
            {
                base.OnMensagem(no, "Situação: Caso 2A");
                no.Irmao.Cor = No.CorRubroNegra.Rubro;
                this.Situacao3(no.Pai);
            }
        }