#ifndef INDICE_ARVORE_BINARIA_H #define INDICE_ARVORE_BINARIA_H #include #include template class Indice_Arvore_Binaria : public Indice > > { public: Indice_Arvore_Binaria(const char* arquivo, const char *campo, const char *referencia, TIPO tcampo, TIPO treferencia) : Indice > >(arquivo, campo, referencia, tcampo, treferencia,"Arvore_Binaria") { }; private: void Percorre_Estrutura_Escrevendo_Arquivo(FILE *fp) { Arvore_Binaria > *estr = estrutura; if (estr != NULL) Imprime_Registro_Arquivo(fp,estr); } void Imprime_Registro_Arquivo(FILE *fp, Arvore_Binaria > *estr) { if (estr != NULL) { String linha(""); linha = estr->Valor().chave; linha += delimitador; linha += estr->Valor().referencia; linha += delimitador_linha; fprintf(fp,"%s",linha.Texto()); if (estr->Esquerda() != NULL) Imprime_Registro_Arquivo(fp,estr->Esquerda()); if (estr->Direita() != NULL) Imprime_Registro_Arquivo(fp,estr->Direita()); } } bool Altera_Elemento(Elemento_Indice elem, t_class2 referencia_nova) { if (estrutura == NULL) return false; else { Arvore_Binaria > *arvore = NULL; if ((arvore = estrutura->Procura(elem)) != NULL) { // OBS: A procura retora elemento com arvore->Valor().chave == elem.chave // ainda temos que conferir se a referencia eh a mesma. Lembre-se: Filhos iguais // sempre `a direita while ((arvore != NULL) && (arvore->Valor().chave == elem.chave)) { if (arvore->Valor().referencia == elem.referencia) { elem.referencia = referencia_nova; arvore->Muda_Valor(elem); return true; } else { arvore = arvore->Direita(); } } } } return false; } bool Remove_Elemento(Elemento_Indice elem) { if (estrutura == NULL) return false; bool retorno = Remove_Elemento_Recursivo(&estrutura,elem); return retorno; } bool Remove_Elemento_Recursivo(Arvore_Binaria > **arv, Elemento_Indice elemento) { Arvore_Binaria > *tmp; if ((arv == NULL) || (*arv == NULL)) { return false; } else { if ( (elemento.chave == (*arv)->Valor().chave) && (elemento.referencia == (*arv)->Valor().referencia) ) { tmp = (*arv)->Remove(); delete (*arv); (*arv) = tmp; return true; } else { if (elemento < (*arv)->Valor()) { bool retorno; tmp = (*arv)->Esquerda(); retorno = Remove_Elemento_Recursivo(&tmp,elemento); (*arv)->Muda_Esquerda(tmp); return retorno; } else { bool retorno; tmp = (*arv)->Direita(); retorno = Remove_Elemento_Recursivo(&tmp,elemento); (*arv)->Muda_Direita(tmp); return retorno; } } } } void Insere_Elemento(Elemento_Indice elem) { if (estrutura == NULL) estrutura = new Arvore_Binaria >(elem); else estrutura->Insere(elem); } }; #endif