Example #1
0
 public NoArvore(Dado informacao)
 {
     info     = informacao; // construtor polimórfico com
     esquerdo = null;       // parâmetros
     direito  = null;
 }
Example #2
0
 public NoArvore(Dado informacao, NoArvore <Dado> esq, NoArvore <Dado> dir)
 {
     info     = informacao; // construtor polimórfico com
     esquerdo = esq;        // parâmetros
     direito  = dir;
 }
Example #3
0
 public ArvoreDeBusca()
 {
     raiz       = null;
     atual      = null;
     antecessor = null;
 }
Example #4
0
 public int CompareTo(NoArvore <Tipo> o)
 {
     return(atual.Info.CompareTo(o.Info));
 }
Example #5
0
        public bool ApagarNo(Tipo chaveARemover)
        {
            atual      = raiz;
            antecessor = null;
            bool ehFilhoEsquerdo = true;

            while (atual.Info.CompareTo(chaveARemover) != 0)  // enqto não acha a chave a remover
            {
                antecessor = atual;
                if (atual.Info.CompareTo(chaveARemover) > 0)
                {
                    ehFilhoEsquerdo = true;
                    atual           = atual.esquerdo;
                }
                else
                {
                    ehFilhoEsquerdo = false;
                    atual           = atual.direito;
                }

                if (atual == null)  // neste caso, a chave a remover não existe e não pode
                {
                    return(false);  // ser excluída, dai retornamos falso indicando isso
                }
            }  // fim do while

            // se fluxo de execução vem para este ponto, a chave a remover foi encontrada
            // e o ponteiro atual indica o nó que contém essa chave

            if ((atual.esquerdo == null) && (atual.direito == null))  // é folha, nó com 0 filhos
            {
                if (atual == raiz)
                {
                    raiz = null;   // exclui a raiz e a árvore fica vazia
                }
                else
                if (ehFilhoEsquerdo)            // se for filho esquerdouerdo, o antecessor deixará
                {
                    antecessor.esquerdo = null; // de ter um descendente esquerdouerdo
                }
                else                            // se for filho direitoeito, o antecessor deixará de
                {
                    antecessor.direito = null;  // apontar para esse filho
                }
                atual = antecessor;             // feito para atual apontar um nó válido ao sairmos do método
            }
            else                                // verificará as duas outras possibilidades, exclusão de nó com 1 ou 2 filhos
            if (atual.direito == null)          // neste caso, só tem o filho esquerdouerdo
            {
                if (atual == raiz)
                {
                    raiz = atual.esquerdo;
                }
                else
                if (ehFilhoEsquerdo)
                {
                    antecessor.esquerdo = atual.esquerdo;
                }
                else
                {
                    antecessor.direito = atual.esquerdo;
                }
                atual = antecessor;
            }
            else
            if (atual.esquerdo == null)          // neste caso, só tem o filho direitoeito
            {
                if (atual == raiz)
                {
                    raiz = atual.direito;
                }
                else
                if (ehFilhoEsquerdo)
                {
                    antecessor.esquerdo = atual.direito;
                }
                else
                {
                    antecessor.direito = atual.direito;
                }
                atual = antecessor;
            }
            else // tem os dois descendentes
            {
                NoArvore <Tipo> menorDosMaiores = ProcuraMenorDosMaioresDescendentes(atual);
                atual.Info      = menorDosMaiores.Info;
                menorDosMaiores = null; // para liberar o nó trocado da memória
            }
            return(true);
        }