void balancearAVL(struct No *r, struct Arvore *t) { int fatorR = fatorBalanceamento(r); int fatorE = fatorBalanceamento(r->esquerda); int fatorD = fatorBalanceamento(r->direita); if(fatorR == -2) { if(fatorD == 1) { rotacaoDireita(r->direita, t); } rotacaoEsquerda(r, t); } else if(fatorR == 2) { if(fatorE == -1) { rotacaoEsquerda(r->esquerda, t); } rotacaoDireita(r, t); } if(r->pai != NULL) { balancearAVL(r->pai, t); } }
struct AVL_TreeNode *balancearNo(struct AVL_TreeNode *no) { struct AVL_TreeNode *novaRaiz = NULL; //Balanceia os filhos, se existirem if (no->left) no->left = balancearNo(no->left); if (no->right) no->right = balancearNo(no->right); int fatorB = fatorBalanceamento(no); if (fatorB >= 2) { //Lado Esquerdo mais pesado if (fatorBalanceamento(no->left) <= -1) novaRaiz = rotacionarEsqDir(no); else novaRaiz = rotacionarEsqEsq(no); } else if (fatorB <= -2) { //Lado Direito mais pesado if (fatorBalanceamento(no->right) >= 1) novaRaiz = rotacionarDirEsq(no); else novaRaiz = rotacionarDirDir(no); } else { //Já está balanceado! novaRaiz = no; } return(novaRaiz); }