tipoNo* balanceamentoCaso3(tipoNo* raiz, tipoNo* n){
    if(verificaCor(noTio(n)) == RUB){
        n->noPai->cor = NEG;
        noTio(n)->cor = NEG;
        noAvo(n)->cor = RUB;
        return balanceamentoCaso1(raiz, noAvo(n));
    }

    else{
        return balanceamentoCaso4(raiz, n);
    }
}
NO* balanceamentoCaso3(NO* raiz, NO* n) {
    if(verificaCor(noTio(n)) == RUB) { /*tem pai vermelho e tio vermelho, troca as cores*/
        n->pai->cor = NEG; /*Trocando a cor do pai, já que quando insere com vermelho, o pai nao pode ser também.*/
        noTio(n)->cor = NEG; /*Trocando a cor do tio*/
        noAvo(n)->cor = RUB;/*Trocando a cor do avô, para assim ficar: V, P, V*/
        return balanceamentoCaso1(raiz, noAvo(n));/*Caso o noAvo ja seja a raiz, entao nao pode ficar vermelha como
                                                deixei, vai cair no caso1 para deixar a raiz preta e retornar raiz.*/
    }

    else {
        return balanceamentoCaso4(raiz, n);
    }
}
Example #3
0
int main(){
    struct veiculo sVeiculos[TAMANHO];
    int i,ano=0,totalBicombustivel=0;
    
    /* Faz a entrada dos valores */
    for (i=0;i<TAMANHO;i++){
        setbuf(stdin, NULL);
        printf("Veiculo No %d de %d:\n\nDigite a marca do veiculo (50 caracteres):\n",i+1,TAMANHO);
        gets(sVeiculos[i].marca);
        setbuf(stdin, NULL);
        printf("Digite o modelo do veiculo (50 caracteres):\n");
        gets(sVeiculos[i].modelo);    
        setbuf(stdin, NULL); 
        
        printf("Digite a cor do veiculo (somente preto, prata ou branco):\n");
        verificaCor(i, sVeiculos);
        setbuf(stdin, NULL);
        printf("Digite o combustivel do veiculo (somente gasolina, etanol ou bicombustivel):\n");
        totalBicombustivel = totalBicombustivel + verificaCombustivel(i,sVeiculos); 
        setbuf(stdin, NULL);

        printf("Digite o ano do veiculo (entre 1678 e 2012) :\n");
        scanf("%d",&ano);
        setbuf(stdin, NULL);
        while (ano < 1678 || ano >2012){
            printf("Ano invalido! Digite outro ano:");
            scanf("%d",&ano);
            setbuf(stdin, NULL);
        }
        sVeiculos[i].ano=ano;
        setbuf(stdin, NULL);      

        system("cls");
    }
    
    /* Ordena o vetor: */
    ordenaVetorAno(sVeiculos);
    
    /* Chama o menu */
    menu(sVeiculos,totalBicombustivel);
    system("pause");
    return 0;
    
}
NO* conserta(NO** raiz, NO* no) {
    NO* aux;
    while((no != *raiz) && (verificaCor(no) == NEG)) {
        if(no == no->pai->esquerda) {
            aux = no->pai->direita;

            if(verificaCor(aux) == RUB) {
                aux->cor = NEG;
                no->pai->cor = RUB;
                rotacaoEsquerdaRR(&no->pai);
                aux = no->pai->direita;
                continue;
            }

            if(verificaCor(aux->esquerda) == NEG && verificaCor(aux->direita) == NEG) {
                aux->cor = RUB;
                no = no->pai;
                continue;
            }

            else if(verificaCor(aux->direita) == RUB) {
                aux->esquerda->cor = NEG;
                aux->cor = RUB;
                rotacaoDireitaRR(&aux);
                aux = aux->pai->direita;
                continue;
            }
            aux->cor = no->pai->cor;
            no->pai->cor = NEG;
            aux->direita->cor = NEG;
            rotacaoEsquerdaRR(&no->pai);
            no = *raiz;
        }

        else {
            aux = no->pai->esquerda;

            if(verificaCor(aux) == RUB) {
                aux->cor = NEG;
                no->pai->cor = RUB;
                rotacaoDireitaRR(&no->pai);
                aux = no->pai->esquerda;
                continue;
            }

            if(verificaCor(aux->esquerda) == NEG && verificaCor(aux->direita) == NEG) {
                aux->cor = RUB;
                no = no->pai;
                continue;
            }

            else if(verificaCor(aux->esquerda) == RUB) {
                aux->direita->cor = NEG;
                aux->cor = RUB;
                rotacaoEsquerdaRR(&aux);
                aux = aux->pai->esquerda;
                continue;
            }
            aux->cor = no->pai->cor;
            no->pai->cor = NEG;
            aux->esquerda->cor = NEG;
            rotacaoDireitaRR(&no->pai);
            no = *raiz;
        }
    }
    if(no != NULL) {
        no->cor = NEG;
    }
    return *raiz;
}
tipoNo* conserta(tipoNo** raiz, tipoNo* no){
    tipoNo* aux;
    while((no != *raiz) && (verificaCor(no) == NEG)){
        if(no == no->noPai->noEsquerdo){
            aux = no->noPai->noDireito;

            if(verificaCor(aux) == RUB){
                aux->cor = NEG;
                no->noPai->cor = RUB;
                rotacaoEsquerdaRR(&no->noPai);
                aux = no->noPai->noDireito;
                continue;
            }

            if(verificaCor(aux->noEsquerdo) == NEG && verificaCor(aux->noDireito) == NEG){
                aux->cor = RUB;
                no = no->noPai;
                continue;
            }

            else if(verificaCor(aux->noDireito) == RUB){
                aux->noEsquerdo->cor = NEG;
                aux->cor = RUB;
                rotacaoDireitaRR(&aux);
                aux = aux->noPai->noDireito;
                continue;
            }
            aux->cor = no->noPai->cor;
            no->noPai->cor = NEG;
            aux->noDireito->cor = NEG;
            rotacaoEsquerdaRR(&no->noPai);
            no = *raiz;
        }

        else{
            aux = no->noPai->noEsquerdo;

            if(verificaCor(aux) == RUB){
                aux->cor = NEG;
                no->noPai->cor = RUB;
                rotacaoDireitaRR(&no->noPai);
                aux = no->noPai->noEsquerdo;
                continue;
            }

            if(verificaCor(aux->noEsquerdo) == NEG && verificaCor(aux->noDireito) == NEG){
                aux->cor = RUB;
                no = no->noPai;
                continue;
            }

            else if(verificaCor(aux->noEsquerdo) == RUB){
                aux->noDireito->cor = NEG;
                aux->cor = RUB;
                rotacaoEsquerdaRR(&aux);
                aux = aux->noPai->noEsquerdo;
                continue;
            }
            aux->cor = no->noPai->cor;
            no->noPai->cor = NEG;
            aux->noEsquerdo->cor = NEG;
            rotacaoDireitaRR(&no->noPai);
            no = *raiz;
        }
    }

    if(no != NULL){
        no->cor = NEG;
    }
    return *raiz;
}