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