Beispiel #1
0
        /// <summary>
        /// Exclui um nodo que abaixo dele possua, ao menos, 1 nodo exteno.
        /// </summary>
        /// <param name="noQueSeraApagado"></param>
        private void ExcluiComNodoExterno(NodoArvore noQueSeraApagado)
        {
            qtdeNodosInternos--;
            //descobre quem será o nodo que irá ficar no lugar do que foi apagado
            NodoArvore nodo_substituto;

            if (noQueSeraApagado.GetNoEsquerda().EhInterno())
            {
                nodo_substituto = noQueSeraApagado.GetNoEsquerda();
            }
            else
            {
                nodo_substituto = noQueSeraApagado.GetNoDireita();
            }
            // substitui o apagado pelo novo nodo
            NodoArvore PaiNodoApagado = noQueSeraApagado.GetNoPai();

            //altera o pai do novo substituto
            nodo_substituto.SetNoPai(PaiNodoApagado);
            //o pai do nodo substituto também deve ter sua referência de filho corrigida.
            //mas primeiro precisamos saber o no apagado er a raiz, que neste caso não tem pai.
            if (PaiNodoApagado != null)
            {
                if (PaiNodoApagado.GetNoDireita() == noQueSeraApagado)
                {
                    PaiNodoApagado.SetNoDireita(nodo_substituto);
                }
                else
                {
                    PaiNodoApagado.SetNoEsquerda(nodo_substituto);
                }
            }
            else
            {
                raiz = nodo_substituto;
            }
        }