... bool CAVL::Insere(int valor, Cno * x, Cno * pai_de_x) { bool h; if( x==NULL) { ... // Aqui é feita a Insercao do no com balanco = 0 // O ponteiro pai_de_x deve ser usado aqui. ... h = TRUE; // Indicando que a arvore pode estar desbalanceada. } else { if( valor == x->chave) { // Chave repetida. Nada a fazer h = FALSE; } else if( valor < x->chave) // Deve descer pelo lado esquerdo { h = Insere(valor,x->FE,x); // Chamada Recursiva. if( h == TRUE ) // Arvore pode estar balanceada { switch( x->balanco ) { case 1 : // Pendendo para a direita x->balanco = 0; h = FALSE; break; case 0: // No balanceado mas precisa continuar // verificando, por isto, h continua com FALSE x->balanco = -1; break; case -1: // No desbalanceado CasoDireito(x,pai_de_x); h = FALSE; break; } } } else { h = Insere(valor,x->FD,x); // Caso Simetrico, com descida pela Direita ... } } return(h); } void CAVL:: CasoDireito(Cno * p,Cno *pai_de_p) { Cno * u; Cno * v; u = p->FE; if( u->balanco == -1) { RD(p,pai_de_p); // Note que precisamos do ponteiro para o pai de p // pois ele tera um novo filho. (Cuidado com o // caso em que p é raiz) p->balanco = 0; u->balanco = 0; } else { v = u->FD; RDD(p,pai_de_p); if( v->balanco == -1) p->balanco = 1; else p->balanco = 0; if(v->balanco == 1) u->balanco = -1; else u->balanco = 0; } } ....