/// <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; } }