//BuscaNo: recebe o no raiz da arvore e um valor e verifica se encontra o valor na arvore
NoRN* BuscaNo(NoRN* raiz, int valor){	
	if(raiz == NULL){
		return raiz;
	}
	if(raiz->valor > valor){		
		return BuscaNo(raiz->filho_esq, valor);
	}
	if(raiz->valor < valor){		
		return BuscaNo(raiz->filho_dir, valor);
	}
	return raiz;	
}
Exemplo n.º 2
0
// Função Remove:	Verifica se o dado a ser removido está armazenado na árvore
ARVORE *Remove(ARVORE *Raiz, int mat)
{
	// Definição de variáveis
	FILE *Pf;
   ARVORE *Paux;

   // Busca o ponteiro que aponta para nó da arvore
   Paux = BuscaNo(Raiz, mat);
   if (!Paux)
   {
      printf("\n\tDado nao encontrado.\n");
      return Raiz;
   } // Fim de if

	// Busca no arquivo
	Pf = fopen("AGENDA.DAT", "rb+");
	if (Pf == NULL)
   {
		printf("\n\t\aERRO: Arquivos de dados nao encontrado.\n");
	  	return NULL;
   } // Fim de if
	Raiz = RemoveNoArvore(Raiz, mat);
//   SalvaArvore(Raiz);
	fclose(Pf);
   return Raiz;
} // Fim de Remove
Exemplo n.º 3
0
// Função CriaNovaArvore: cria uma arvore balanceada
ARVORE *CriaNovaArvore(ARVORE *Raiz1, ARVORE *Raiz2, int *V2)
{
   // Definição de variáveis
   ARVORE *Px, *p, *q, *Paux;

	// Colocando o dado na arvore
   Px = ReservaNo();
   if(!Px) return NULL;
   Paux = BuscaNo(Raiz1,*V2);
   Px->EnderecoRegistro = Paux->EnderecoRegistro;
   Px->Matricula = *V2;

   // Insere o Primeiro NO
	if(!Raiz2)
   {
		Raiz2 = Px;
//		SalvaArvore(Raiz2);
		return Raiz2;
	} // Fim de if

   //Insere um NO na Arvore Nao Vazia
	q = Raiz2;
	while(q != NULL)
   {
   	p = q;
		if(*V2 < q->Matricula) q = p->LL;
		else q = p->RL;
   } // Fim de while

   // Insere como um novo nó e finaliza
   if (*V2 < p->Matricula) p->LL = Px;
   else p->RL = Px;

   return Raiz2;
} // Fim de CriaNovaArvore
Exemplo n.º 4
0
// Função BuscaNO: Busca um determinado nó na árvore
ARVORE *BuscaNo(ARVORE *Raiz, int mat)
{
	// Definição de variáveis
   ARVORE *Paux;

	// Verifica se a árvore está vazia
   if (!Raiz) return NULL;

   // Verifica se encontrou o nó com a informação dado
   if (mat == Raiz->Matricula) return Raiz;

  	//Pesquisar Na Sub-Arvore Esquerda e Direita
	if (mat <= Raiz->Matricula) Paux = BuscaNo(Raiz->LL, mat);
  	if (mat > Raiz->Matricula) Paux = BuscaNo(Raiz->RL, mat);
	return Paux;
} // Fim de BuscaNO
Exemplo n.º 5
0
// Função BuscaInfo: Verifica se um dado está no arquivo de dados
void BuscaInfo(ARVORE *Raiz, int mat)
{
	// Definição de variáveis locais
	FILE *Pf;
	DADOS Dados;
   ARVORE *Paux;

   // Busca o ponteiro que aponta para nó da arvore
   Paux = BuscaNo(Raiz, mat);
   if (!Paux)
   {
      printf("\n\tDado nao encontrado.\n");
      return;
   }

	// Busca no arquivo
	Pf = fopen("AGENDA.DAT", "rb+");
	if (Pf == NULL)
   {
		printf("\n\t\aERRO: Arquivos de dados nao encontrado.\n");
	  	return;
   }
   fseek(Pf, Paux->EnderecoRegistro, 0);
	fread(&Dados, sizeof(DADOS), 1, Pf);
	fclose(Pf);
   printf("\n\tDado encontrado.");
   printf("\n\t  Matricula: %d", Dados.Matricula);
   printf("\n\t  Nome: %s", Dados.Nome);
   printf("\n\t  Telefone: %s\n", Dados.Telefone);
} // Fim de BuscaInfo
int RemoverDaArvoreRN(ArvoreRN *arvore, int elem) {
	int corOriginal;
	NoRN *mm, *filho, *pai, *aux;
	NoRN *no = BuscaNo(arvore->raiz, elem);

	aux = no;
	mm = no;
	corOriginal = no->cor;
	if(no->filho_esq == NULL) {
		filho = no->filho_dir;
		pai = no;
		printf("entrou if 1");
		TransplanteArvoreRN(arvore, no, no->filho_dir);
	} 
	else if(no->filho_dir == NULL){
		printf("entrou if 2");
		pai = no;
		filho = no->filho_esq;
		TransplanteArvoreRN(arvore, no, no->filho_esq);
	}
	else {
		printf("entrou else 1");
		mm = MenorDosMaiores(no);
		corOriginal = mm->cor;
		filho = mm->filho_dir;
		if(mm->pai == no) {
			filho->pai = mm;
		}
		else {
			printf("entrou else 2");
			TransplanteArvoreRN(arvore, mm, mm->filho_dir);
			mm->filho_dir = no->filho_dir;
			mm->filho_dir->pai = mm;
		}
		TransplanteArvoreRN(arvore, no, mm);
		mm->filho_esq = no->filho_esq;
		mm->filho_esq->pai = mm;
		mm->cor = no->cor;
	}
	printf("remove");

	if(corOriginal == PRETO) {
		if(aux != NULL)
			RemontaArvoreRN(arvore, aux);
		else 
			RemontaArvoreRN(arvore, pai);
	}
	return 0;
}
Exemplo n.º 7
0
// Função InsereNovoRegistro: Insere um novo registro
ARVORE *InsereNovoRegistro(ARVORE *Raiz)
{
   // Definição de variáveis
   DADOS *Info;
   ARVORE *Px, *p, *q, *Paux;
   int nReg;

   // Reservando memória dinamicamente do tipo DADOS
   Info = (DADOS *) calloc (1, sizeof(DADOS));

   // Lendo a chave primaria - Matricula
   printf("\n\tDigite a Matricula: ");
   scanf("%d", &Info->Matricula);

   // Verificando se já existe Matricula
   Paux = BuscaNo(Raiz, Info->Matricula);
   if (Paux)
   {
		printf("\n\t\aERRO: A matricula %d ja esta armazenada.\n", Info->Matricula);
      getch();
      return Raiz;
   } // Fim de if

	// Lendo os outros dados
   printf("\tDigite o Nome: ");
   scanf(" %[^\n]", Info->Nome);
   printf("\tDigite o Telefone: ");
   scanf(" %[^\n]", Info->Telefone);

   // Verificando a quantidade de registros
   nReg = LeReg();

   // Salvando no arquivo AGENDA.DAT
   SalvaReg(Info);
	printf("\n\tRegistro salvo com sucesso.\n");

	// Colocando o dado na arvore
   Px = ReservaNo();
   if (!Px) return NULL;
   Px->EnderecoRegistro = nReg * sizeof(DADOS);
   Px->Matricula = Info->Matricula;

   // Insere o Primeiro NO
	if (!Raiz)
   {
		Raiz = Px;
//		SalvaArvore(Raiz);
		return Raiz;
	} // Fim de if

   // Insere um nó na árvore não-vazia
	q = Raiz;
	while (q != NULL)
   {
   	p = q;
		if (Info->Matricula < q->Matricula) q = p->LL;
		else q = p->RL;
   } // Fim de while

   // Insere como um novo nó e finaliza
   if (Info->Matricula < p->Matricula) p->LL = Px;
   else p->RL = Px;

   // Salva árvore
//   SalvaArvore(Raiz);

   return Raiz;
} // Fim de InsereNovoRegistro
//BuscaNaArvore: recebe a arvore e um valor e chama a funcao BuscaNo para procurar esse valor
int BuscaNaArvore(ArvoreRN arvore, int valor){	
	if(BuscaNo(arvore.raiz, valor)){
		return 1;
	}
	return 0;
}