/**
     * @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;
    }
예제 #2
0
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;
    }