/// <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; } }
/// <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())); } }
private void PercursoInterfixado(Nodo no) { if (no.EhExterno()) { return; } PercursoInterfixado(no.GetNoEsquerda()); lista.Add(no.GetValor()); PercursoInterfixado(no.GetNoDireita()); }
/// <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()); }