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
        private No AtualizarCores(No no)
        {
            No pai = no.Pai;

            if (pai.Cor.Equals(No.CorRubroNegra.Rubro))
            {
                No tio = null;
                //se pai é filho direito então tio é filho esquerdo de vô
                if (pai.EFilhoDireito())
                {
                    tio = pai.Pai.FilhoEsquerdo;
                }
                else
                {
                    tio = pai.Pai.FilhoDireito;
                }

                //tio é negro
                if (tio == null || tio.Cor.Equals(No.CorRubroNegra.Negro))
                {
                    base.OnMensagem(no, "Situação 3");
                    no = base.Rotacionar(no);
                }
                //se o tio é rubro
                else
                {
                    base.OnMensagem(no, "Situação 2");
                    tio.Cor = No.CorRubroNegra.Negro;
                    pai.Cor = No.CorRubroNegra.Negro;
                    if (!pai.Pai.ERaiz())
                    {
                        pai.Pai.Cor = No.CorRubroNegra.Rubro;
                        no          = this.AtualizarCores(no.Pai.Pai);
                    }
                }
            }

            return(no);
        }
Ejemplo n.º 3
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);
            }
        }
Ejemplo n.º 4
0
        public object Remover(No root, int chave)
        {
            //Busca a chave na arvore
            No r = this.Pesquisar(root, chave);

            //Visite(r);
            //Verifica se o no esta na arvore
            if (r != null && ((int)r.Valor == (int)chave))
            {
                //verifica se o no é folho
                if (r.EExterno())
                {
                    //No a ser removido é negro (sucessor negro) entao segue para a situação 3
                    if (r.Cor.Equals(No.CorRubroNegra.Negro))
                    {
                        this.Situacao3(r);
                    }
                    //No a ser removido é rubro então pode seguir normalmente

                    //Removendo...
                    //verifica se o no é o filho direito
                    if (r.EFilhoDireito())
                    {
                        r.Pai.FilhoDireito = null;
                        r.Pai = null;
                    }
                    //o no é filho esquerdo
                    else
                    {
                        r.Pai.FilhoEsquerdo = null;
                        r.Pai = null;
                    }
                }
                //Verifica se o no a remover tem 1 filho e é filho direito
                else if (r.FilhoDireito != null && r.FilhoEsquerdo == null)
                {
                    No sucessor = r.FilhoDireito;

                    //Sucessor é rubro
                    //Acontece nada de mais

                    //Sucessor é negro
                    if (sucessor.Cor.Equals(No.CorRubroNegra.Negro))
                    {
                        if (r.Cor.Equals(No.CorRubroNegra.Negro))
                        {
                            this.Situacao3(sucessor);
                        }
                        else
                        {
                            sucessor.Cor = No.CorRubroNegra.Rubro;
                            this.Situacao3(sucessor);
                        }
                    }

                    r.Valor = sucessor.Valor;

                    this.Remover(r.FilhoDireito, sucessor.Valor);
                }
                //Verifica se o no tem 1 filho e é filho esquerdo
                else if (r.FilhoEsquerdo != null && r.FilhoDireito == null)
                {
                    No sucessor = r.FilhoEsquerdo;

                    //Sucessor é rubro
                    //Acontece nada de mais

                    //Sucessor é negro
                    if (sucessor.Cor.Equals(No.CorRubroNegra.Negro))
                    {
                        if (r.Cor.Equals(No.CorRubroNegra.Negro))
                        {
                            this.Situacao3(sucessor);
                        }
                        else
                        {
                            sucessor.Cor = No.CorRubroNegra.Rubro;
                            this.Situacao3(sucessor);
                        }
                    }
                    r.Valor = sucessor.Valor;
                    this.Remover(r.FilhoEsquerdo, sucessor.Valor);
                }
                //O no a remover tem 2 filhos
                else
                {
                    //Acha o sucessor
                    No herdeiro = this.Sucessor(r.FilhoDireito);

                    //Sucessor é rubro
                    //Acontece nada de mais
                    //Sucessor é negro
                    if (herdeiro.Cor.Equals(No.CorRubroNegra.Negro))
                    {
                        //no negro e sucessor negro
                        //situação 3
                        if (r.Cor.Equals(No.CorRubroNegra.Negro))
                        {
                            this.Situacao3(herdeiro);
                            base.OnMensagem("Situação 3");
                        }
                        //no rubro e sucessor negro
                        //situação 4
                        else
                        {
                            herdeiro.Cor = No.CorRubroNegra.Rubro;
                            this.Situacao3(herdeiro);
                            base.OnMensagem("Situação 4");
                        }
                    }

                    r.Valor = herdeiro.Valor;

                    this.Remover(r.FilhoDireito, herdeiro.Valor);
                }
                return(r);
            }
            return(null);
        }