/// <summary> /// Exclui um nodo que abaixo dele possua, ao menos, 1 nodo exteno. /// </summary> /// <param name="noQueSeraApagado"></param> private void ExcluiComNodoExterno(Nodo noQueSeraApagado) { qtdeNodosExternos--; qtdeNodosInternos--; //descobre quem será o nodo que irá ficar no lugar do que foi apagado Nodo nodo_substituto; if (noQueSeraApagado.GetNoEsquerda().EhInterno()) { nodo_substituto = noQueSeraApagado.GetNoEsquerda(); } else { nodo_substituto = noQueSeraApagado.GetNoDireita(); } // substitui o apagado pelo novo nodo Nodo 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; } }
/// <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); } }
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()); }