Example #1
0
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);
    }
}
Example #2
0
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);
}