//------------------------------------------------------------------------------ lista ordena_vertice(grafo g, vertice r, lista l) { lista l2; aresta_t a; r->processado = 2; for (a = r->aresta; a; a = a->next) { if (a->vertice->processado == 2) { return NULL; } if (!a->vertice->processado) { a->vertice->pai = r; l2 = ordena_vertice(g, a->vertice, l); if (!l2) { return NULL; } } } r->processado = 1; l = insere_no(l, r); return l; }
void insercao(parvore *raiz, tcod v) { parvore x, tio, avo; if ( (x = insere_no(raiz, v)) == NULL ) { return; } x -> cor = VERMELHO; while (x != (*raiz) && (x -> pai -> cor == VERMELHO )) { avo = x -> pai -> pai; if (x -> pai == avo -> esq) { tio = avo -> dir; if (tio -> cor == VERMELHO) { x -> pai -> cor = PRETO; tio -> cor = PRETO; avo -> cor = VERMELHO; x = avo; } else { // a cor do tio e negro if ( x == x -> pai -> dir) { // x, o filho direito de seu pai x = x -> pai; dica_da_rotacao(*raiz," esquerda "); rotacao_esquerda(&x, raiz); } x -> pai -> cor = PRETO; avo = x -> pai -> pai; avo -> cor = VERMELHO; dica_da_rotacao(*raiz, " direita "); rotacao_direita(&avo, raiz); } } else { // pai de x, o filho direito do avo de x.Este caso // semelhante ao anterior.Basta repetir o codigo acima // substituindo esq por dir tio = avo -> esq; if (tio -> cor == VERMELHO) { x -> pai -> cor = PRETO; tio -> cor = PRETO; avo -> cor = VERMELHO; x = avo; } else { if ( x == x -> pai -> esq) { // x, o filho direito // de seu pai x = x -> pai; dica_da_rotacao(*raiz, " direita "); rotacao_direita(&x, raiz); } x -> pai -> cor = PRETO; avo = x -> pai -> pai; avo -> cor = VERMELHO; dica_da_rotacao(*raiz, " esquerda "); rotacao_esquerda (&avo, raiz); } } } (*raiz) -> cor = PRETO; }