| HD(x)-HE(x)| < = 1
Para cada nó x manteremos um campo chamado balanço, que corresponderá à diferença entre as alturas das sub-árvores direita e esquerda de x. Ou seja,Cada nó da AVL possuirá a seguinte strutura: Balanço(x) = HD(x)-HE(x)
struct SNo
{ ... chave ...
SNo * FilhoEsquerdo,
SNo * FilhoDireito;
int Balanço;
}
InserçãoAVL(...)
Inserir nó v usando algoritmo de inserção da ABB Seja v um ponteiro para o nó Inserido. v->Balanco = 0 v = Pai(v) Enquanto v != NULL [O(logn)] Se Inseriu à Esquerda de v Se v->Balanco = = 1 v->Balanco = 0 Break // Terminou Insercao. Se v->Balanco = = 0 v->Balanco = -1 // Mudou Altura mas não desregulou. // Precisa continuar verificando ancestrais.' Se v->Balanco = = -1 entao Balancear(v) Break Senao // Inseriu à Direita de v // Simétrico ao ''Se'' v = Pai(v); // v deve "ir subindo" |
Balancear(SNo * p)
// Verificar o tipo da rotação [O(log1)] Se Inseriu à Esquerda de p u = p->FilhoEsquerdo Se inseriu à Esquerda de u RD(p,u) // Rotação à Direita Senão // Rotação Dupla à Direita RDD(p,u,u->FilhoDireito) Senão // Inseriu à Direita de p // Caso Simétrico (RE, RDE). // Executar rotação e Ajustar balanço [O(log1)]
|
Algorítmo Recursivo: Clique
aqui para obter um "rascunho" de uma implementação de
um algorítmo recursivo para inserção em AVL.