Esempio n. 1
0
        public No Remover(int chave, No no)
        {
            if (no == null)
            {
                return(null);
            }
            if (chave < no.Chave)
            {
                return(this.Remover(chave, no.Esquerdo));
            }
            else if (chave > no.Chave)
            {
                return(Remover(chave, no.Direito));
            }
            else
            {
                if (no.Esquerdo != null && no.Direito != null)
                {
                    No retorno = no;
                    No novo    = no.Direito;

                    while (novo.Esquerdo != null && no.Direito != null)
                    {
                        novo = novo.Esquerdo;
                    }

                    novo     = Remover(novo.Chave, no);
                    no.Chave = novo.Chave;
                    no.Valor = novo.Valor;

                    return(retorno);
                }
                else if (no.Esquerdo != null)
                {
                    No removido = no;
                    AtualizarFatorBalanceamento(no, Operacao.Remover);

                    if (no.Pai == null)
                    {
                        this.Raiz = no.Esquerdo;
                    }
                    else
                    {
                        if (no.Pai.Chave < no.Chave)
                        {
                            no.Pai.Direito = no.Esquerdo;
                        }
                        else
                        {
                            no.Pai.Esquerdo = no.Esquerdo;
                        }
                    }

                    no.Esquerdo.Pai = no.Pai;

                    return(removido);
                }
                else if (no.Direito != null)
                {
                    No removido = no;
                    AtualizarFatorBalanceamento(no, Operacao.Remover);
                    if (no.Pai == null)
                    {
                        this.Raiz = no.Direito;
                    }
                    else
                    {
                        if (no.Pai.Chave < no.Chave)
                        {
                            no.Pai.Direito = no.Direito;
                        }
                        else
                        {
                            no.Pai.Esquerdo = no.Direito;
                        }
                    }
                    no.Direito.Pai = no.Pai;

                    return(removido);
                }
                else
                {
                    No pai = no.Pai;

                    if (pai == null)
                    {
                        this.Raiz = null;
                        return(no);
                    }
                    AtualizarFatorBalanceamento(no, Operacao.Remover);
                    no.Pai = null;

                    if (no.Chave > pai.Chave)
                    {
                        pai.Direito = null;
                    }
                    else
                    {
                        pai.Esquerdo = null;
                    }
                    return(no);
                }
            }
        }