Exemple #1
0
        /// <summary>
        /// Remove um valor da árvore
        /// </summary>
        /// <param name="valor"></param>
        public void Remove(IComparer comparador, object chave)
        {
            //primeiro, procuramos o nodo que tem o valor:
            Nodo noQueSeraApagado = PesquisaValor(comparador, chave, raiz);

            if (noQueSeraApagado == null || noQueSeraApagado.EhExterno())
            {
                throw new Exception("Valor não existe na árvore");
            }
            else
            {
                // um dos filhos é um nó externo
                if (noQueSeraApagado.GetNoEsquerda().EhExterno() ||
                    noQueSeraApagado.GetNoDireita().EhExterno())
                {
                    ExcluiComNodoExterno(noQueSeraApagado);
                }
                else
                {
                    ExcluiSemNodoExterno(noQueSeraApagado);
                }
            }

            if (qtdeNodosInternos == 0)
            {
                qtdeNodosExternos = 0;
            }
        }
Exemple #2
0
 /// <summary>
 /// Pesquisa um nodo na árvore e devolve o nodo. Caso não encontre, devolve o nodo
 /// externo onde a pesquisa parou.
 /// </summary>
 /// <param name="valor"></param>
 /// <param name="no"></param>
 /// <returns></returns>
 private Nodo PesquisaValor(IComparer comparador,
                            object chave,
                            Nodo no)
 {
     if (no == null)
     {
         return(null);
     }
     else if (no.EhExterno())
     {
         return(no);    // não achou!
     }
     else if (comparador.Compare(chave, no.GetValor()) == 0)
     {
         return(no);
     }
     else if (comparador.Compare(chave, no.GetValor()) > 0)
     {
         return(PesquisaValor(comparador, chave, no.GetNoDireita()));
     }
     else
     {
         return(PesquisaValor(comparador, chave, no.GetNoEsquerda()));
     }
 }
Exemple #3
0
 private void PercursoInterfixado(Nodo no)
 {
     if (no.EhExterno())
     {
         return;
     }
     PercursoInterfixado(no.GetNoEsquerda());
     lista.Add(no.GetValor());
     PercursoInterfixado(no.GetNoDireita());
 }
Exemple #4
0
        /// <summary>
        /// Pesquisa o próximo nodo Interno seguindo o percurso interfixado.
        /// </summary>
        /// <param name="no"></param>
        /// <returns></returns>
        private Nodo PesquisaNodoInternoInterfixado(Nodo no)
        {
            if (no.EhExterno())
            {
                return(null);
            }
            Nodo retorno = PesquisaNodoInternoInterfixado(no.GetNoEsquerda());

            if (retorno == null)
            {
                return(no);
            }
            else
            {
                return(retorno);
            }
        }
Exemple #5
0
        private void CalculaAltura(Nodo no)
        {
            if (no.EhExterno())
            {
                //calcular a profundidade deste nodo externo
                Nodo aux  = no;
                int  qtde = 0;
                while (aux.GetNoPai() != null)
                {
                    qtde++;
                    aux = aux.GetNoPai();
                }

                if (qtde > maiorProfundidadeEncontrada)
                {
                    maiorProfundidadeEncontrada = qtde;
                }
                return;
            }
            CalculaAltura(no.GetNoEsquerda());
            CalculaAltura(no.GetNoDireita());
        }