Beispiel #1
0
// 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;
}
Beispiel #2
0
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;
}