// o campo balanço é 0 se vermelho e 1 se preto int insereRN(int x, nodo **ptraiz, nodo **ptatual, nodo **ptpai, nodo **ptavo, int *a) { nodo *ptnovo; int ret = 0; if (*ptatual == NULL) { iniciano(x, ptatual); if (*ptraiz == *ptatual) {//NULL) { //printf("Criando raiz\n"); (*ptatual)->balanco = 1; *ptraiz = *ptatual; } else if (x < (*ptpai)->chave) { //printf("Colocando filho esquerdo\n"); (*ptpai)->esq = *ptatual; } else { //printf("Colocando filho direito\n"); (*ptpai)->dir = *ptatual; } } else if (x != (*ptatual)->chave) { if ( x < (*ptatual)->chave ) { ptnovo = (*ptatual)->esq; } else { ptnovo = (*ptatual)->dir; } //printf("Recursão\n"); ret = insereRN(x, ptraiz, &ptnovo, ptatual, ptpai, a); //printf("Voltanda da recursão\n"); if (*a==1) { rotaRN(ptraiz, &ptnovo, ptatual, ptpai, ptavo, a); } else if (*a==0) { *a = 1; } } else return 1;//printf("Inserção Inválida"); return ret; }
int main() { FILE *file; // Declara dois arquivos unsigned int a[MAXLISTA], i, n = 0; clock_t ct_i, ct_f; nodo *ptaux; nodo *arvore = NULL; int alterado=0; char nome[20] = "lista.txt"; //char nome[20] = "listaordenada.txt"; // Abre os arquivos, um para a leitura e outra para a escrita if (! (file = fopen(nome, "r")) ) { printf("Lista não encontrada!\nCriando lista..."); geralista(MAXLISTA); printf("Ok\n"); file = fopen(nome, "r"); } // Leitura do arquivo no vetor for (i =0; i<MAXLISTA; i++) { fscanf(file, "%d", &a[i]); } printf("Começando a criar...\n"); // Tempo antes da operação ct_i = clock(); ptaux = arvore; for (i=0; i<(MAXLISTA); i++) { ptaux = arvore; if (buscabinaria(a[i], &ptaux) != 1) { inserenodo(a[i], &arvore); n++; } } printf("%d\n", n); ct_f = clock(); // Tempo depois da operação printf("Árvore binária construída!\n"); //simet(arvore); ptaux = arvore; calculaalturas(arvore); //simet(arvore); printf("A altura da árvore é %d \n", arvore->altura); // Escreve a diferença da tela printf("Levou %lf segundos para operar a árvore com %d elementos.\n", ((float)(ct_f - ct_i) / CLOCKS_PER_SEC), n); printf("Começando a criar árvore balanceada...\n"); ct_i = clock(); n = 0; nodo *raiz, *noatual, *nopai, *noavo; raiz = NULL; for (i=0; i<MAXLISTA; i++) { noatual = NULL; nopai = NULL; noavo = NULL; alterado = 1; if (insereRN(a[i], &raiz, &raiz, &nopai, &noavo, &alterado) == 0) { n++; //printf("%d\n", n); } } //printf("%d\n", n); ct_f = clock(); // Tempo depois da operação printf("Árvore binária balanceada construída!\n"); //simet(arvore); calculaalturas(raiz); //simet(arvore); printf("A altura da árvore balanceada é %d \n", raiz->altura); // Escreve a diferença da tela printf("Levou %lf segundos para operar a árvore balanceada com %d elementos.\n", ((float)(ct_f - ct_i) / CLOCKS_PER_SEC), n); printf("Ordenando lista...\n"); qsort(a, MAXLISTA, sizeof(int),compara2); printf("Começando a criar nova árvore...\n"); ct_i = clock(); n = 0; //Zerando árvore nodo *raiz2; raiz2 = NULL; for (i=0; i<(MAXLISTA); i++) { noatual = NULL; nopai = NULL; noavo = NULL; alterado = 1; if (insereRN(a[i], &raiz2, &raiz2, &nopai, &noavo, &alterado) == 0) { n++; //printf("%d\n", n); } } //printf("%d\n", n); ct_f = clock(); // Tempo depois da operação printf("Árvore binária balanceada com lista ordenada construída!\n"); //simet(arvore); calculaalturas(raiz2); //simet(arvore); printf("A altura da árvore balanceada com lista ordenada é %d \n", raiz2->altura); // Escreve a diferença da tela printf("Levou %lf segundos para operar a árvore balanceada com %d elementos.\n", ((float)(ct_f - ct_i) / CLOCKS_PER_SEC), n); // Fecha os arquivos fclose(file); /* Note que mesmo com MAXLISTA = 100000 os procedimentos de * leitura e escrita são quase imperceptíveis */ return 0; }