Esempio n. 1
0
Tree * balance (Tree * tree) {
    if (tree -> nil)
        return tree;

    Balance balanced = balanceCase(tree);

    switch (balanced) {
        case Balanced:
            tree -> left = balance(tree -> left);
            tree -> right = balance(tree -> right);
            return tree;
        case LL:
            ll++;
            tree -> left = balance(tree -> left);
            tree -> right = balance(tree -> right);
            return rotateLL(tree);
        case LR:
            lr++;
            tree -> left = balance(tree -> left);
            tree -> right = balance(tree -> right);
            return rotateLR(tree);
        case RL:
            rl++;
            tree -> left = balance(tree -> left);
            tree -> right = balance(tree -> right);
            return rotateRL(tree);
        case RR:
            rr++;
            tree -> left = balance(tree -> left);
            tree -> right = balance(tree -> right);
            return rotateRR(tree);
    }
}
Esempio n. 2
0
node* balanceNode(node* nod) {
	node* newroot = NULL;
	
	int bf = 0;

	if(nod->left)
		nod->left = balanceNode(nod->left);
	if(nod->right)
		nod->right= balanceNode(nod->right);

	bf = balanceFactor(nod);

	if(bf >= 2) {
		if(balanceFactor(nod->left) <= -1 )
			newroot = rotateLR(nod);
		else
			newroot = rotateLL(nod);
	}else if(bf <= -2) {
		if(balanceFactor(nod->right)<= 1)
			newroot = rotateRL(nod);
		else
			newroot = rotateRR(nod);
	}else
		newroot = nod;

	return(newroot);
}
Esempio n. 3
0
Tree * rotateRL (Tree * tree) {

    Tree * r = tree -> right;
    Tree * rl = tree -> right -> left;
    Tree * rlr = tree -> right -> left -> right;

    tree -> right = rl;
    tree -> right -> right = r;
    tree -> right -> right -> left = rlr;

    tree = rotateRR(tree);

    return tree;
} 
Esempio n. 4
0
void balanceCheck(struct node *root){
     if ( getHeight(root->left) > (getHeight(root->right) + 1) ){
        printf("Imbalance! The Right sub-tree of node %d is taller!\n",root->value);
        if ( getHeight(root->left->right) > (getHeight(root->left->left)) ){
           printf("Rotating using LR Rotation...\n");
           rotateLR(root);
        } else {
          printf("Rotating using LL Rotation...\n");
          rotateLL(root);
        }

     } else if ( getHeight(root->right) > (getHeight(root->left) + 1) ){
        printf("Imbalance! The Right sub-tree of node %d is taller!\n",root->value);

        if ( getHeight(root->right->left) > (getHeight(root->right->right)) ){
           printf("Rotating using RL Rotation...\n");
           rotateRL(root);
        } else {
           printf("Rotating using RR Rotation...\n");
           rotateRR(root);
        }
     }
}