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); } }
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; }