Exemple #1
0
 private No PesquisarPai(No no, int chave)
 {
     //Verifica se o no não tem filho
     if (no.EExterno())
     {
         return(no);
     }
     //Verifica se o no que procura esta do lado esquerdo
     if ((int)chave < (int)no.Valor)
     {
         if (no.FilhoEsquerdo == null)
         {
             return(no);
         }
         else
         {
             return(PesquisarPai(no.FilhoEsquerdo, chave));
         }
     }
     //Verifica se o no que procura esta do lado direito
     else
     {
         if (no.FilhoDireito == null)
         {
             return(no);
         }
         else
         {
             return(PesquisarPai(no.FilhoDireito, chave));
         }
     }
 }
Exemple #2
0
 public No Sucessor(No no)
 {
     //Verifica se é folha ou se nao tem filho esquerdo --> encontrou o menor filho do no a remover
     if (no.EExterno() || no.FilhoEsquerdo == null)
     {
         return(no);
     }
     //Continua a procura a apartir do filho esquerdo
     else
     {
         return(this.Sucessor(no.FilhoEsquerdo));
     }
 }
Exemple #3
0
 public No Pesquisar(No no, int chave)
 {
     //Verifica se o no não tem filho
     if (no.EExterno())
     {
         return(no);
     }
     //Verifica se achou o no
     if (no.Valor == chave)
     {
         return(no);
     }
     //Verifica se o no que procura esta do lado esquerdo
     else if ((int)chave < (int)no.Valor)
     {
         return(Pesquisar(no.FilhoEsquerdo, chave));
     }
     //Verifica se o no que procura esta do lado direito
     else
     {
         return(Pesquisar(no.FilhoDireito, chave));
     }
 }
Exemple #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);
        }