/** * @brief Método para rebalencear os nodos filhos e pai de uma árvore * RB. A rotação será realizada do lado direito da árvore. * Após feita a rotação, os filhos poderão ser recoloridos * para manter as propriedades originais da árvore. * * @param arv Raiz da árvore que será rotacionada */ NoRB<T>* roda_dir(NoRB<T> *arv) { NoRB<T> *nodo, *tmp; nodo = arv->getDireita(); arv->direita = nodo->getEsquerda(); nodo->esquerda = arv; nodo->pai = arv->getPai(); arv->pai = nodo; if (arv->getDireita() != nullptr) { arv->getDireita()->pai = arv; } tmp = nodo->getEsquerda(); if (getCor(tmp->getEsquerda()) == RB_RUBRO) { if (nodo->getPai() != nullptr) { nodo->cor = RB_RUBRO; } else { nodo->cor = RB_NEGRO; } nodo->getEsquerda()->cor = RB_NEGRO; nodo->getDireita()->cor = RB_NEGRO; } else { nodo->cor = RB_NEGRO; tmp->cor = RB_RUBRO; } return nodo; }
void Bola::desenhaBola(BITMAP *buffer){//, Ponto p){ int r, g, b; int d = getD(); Ponto p = getP(); Cor_bola c = getCor(); switch(c){ case AMARELO: r = 255; g = 255; b = 0; break; case VERDE: r = 0; g = 255; b = 0; break; case AZUL: r = 0; g = 0; b = 255; break; default: // VERMELHO: r = 255; g = 0; b = 0; break; } circlefill(buffer, p.x, p.y, d/2, makecol(r, g, b)); }
/** * @brief Método para verificar se após a inserção, a árvore * não está desbalanceada e se segue as propriedades * originais. Será verificado os filhos e os netos da * árvore e de acordo com a coloração de cada um faremos * uma determinada rotação. * * @param nodo Árvore que será verificada */ NoRB<T>* fixViolation(NoRB<T>* nodo) { if (getCor(nodo->getDireita()) == RB_RUBRO) { if (getCor(nodo->getDireita()->getDireita()) == RB_RUBRO) { return roda_dir(nodo); } if (getCor(nodo->getDireita()->getEsquerda()) == RB_RUBRO) { return roda_dup_dir(nodo); } } if (getCor(nodo->getEsquerda()) == RB_RUBRO) { if (getCor(nodo->getEsquerda()->getEsquerda()) == RB_RUBRO) { return roda_esq(nodo); } if (getCor(nodo->getEsquerda()->getDireita()) == RB_RUBRO) { return roda_dup_esq(nodo); } } return nodo; }