private void ExcluiSemNodoExterno(NodoArvore noQueSeraApagado) { //encontra o nodo substituto NodoArvore NodoSubstituto = PesquisaNodoInternoInterfixado(noQueSeraApagado.GetNoDireita()); Console.Write("Nodo substituto: " + NodoSubstituto.GetValor().Nome); //Altera o valor do nodo que será removido pelo valor do nodo substituto noQueSeraApagado.SetValor(NodoSubstituto.GetValor()); //Remove o nodo substituto ExcluiComNodoExterno(NodoSubstituto); }
/// <summary> /// Percorre toda a arvore em sentido crescente a partir de um nodo, adicionada na lista especificada /// de maneira recursiva todos os itens da arvore que: são do mesmo Type que o Type especificado em /// tipo, ou herdam do tipo ou implementam o tipo /// </summary> /// <param name="no">Nodo que será analisado</param> /// <param name="list">Lista onde será armazenado os dados</param> /// <param name="tipo">typeof() da classe ou interface para procurar</param> private void PercursoInterfixado(NodoArvore no, ref Lista list, Type tipo) { if (no.EhExterno()) { return; } PercursoInterfixado(no.GetNoEsquerda(), ref list, tipo); if (no.GetValor().GetType() == tipo || no.GetValor().GetType().IsSubclassOf(tipo) || no.GetValor().GetType().GetInterfaces().Contains(tipo)) { list.InserirNoFim(no.GetValor());// Se for do mesmo tipo do objeto passado como parametro, ou herdar dele ou implementar ele } PercursoInterfixado(no.GetNoDireita(), ref list, tipo); }
/// <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 NodoArvore PesquisaValor(string nome, NodoArvore no) { if (no.EhExterno()) { return(no); // não encontrou } else if (no.GetValor().Nome == nome) { return(no); } else if (nome.CompareTo(no.GetValor().Nome) >= 1) { return(PesquisaValor(nome, no.GetNoDireita())); } else { return(PesquisaValor(nome, no.GetNoEsquerda())); } }
private void PercursoInterfixadoIdade(NodoArvore no, ref Lista list) { if (no.EhExterno()) { return; } PercursoInterfixadoIdade(no.GetNoEsquerda(), ref list); list.AdicionarEmOrdem(no.GetValor()); // Se for do mesmo tipo do objeto passado como parametro, ou herdar dele ou implementar ele PercursoInterfixadoIdade(no.GetNoDireita(), ref list); }
/// <summary> /// Pesquisa um valor na arvore binaria, e caso encontrado retorna ele /// </summary> /// <param name="nome">nome do animal procurado</param> /// <returns></returns> public Animal Pesquisar(string nome) { NodoArvore no_aux = new NodoArvore(); no_aux = PesquisaValor(nome, raiz); if (no_aux.EhExterno()) { throw new Exception("Animal não encontrado!"); } else { return(no_aux.GetValor()); } }