Example #1
0
void balanceAvl(struct node **root){
	if(*root == NULL)
		return;
		
	int height_diff = 0;
	height_diff = height_difference(*root);
	if((*root)->lptr)
		balanceAvl(&(*root)->lptr);
	else
		balanceAvl(&(*root)->rptr);
		
	if(height_diff >= 2){
		if(height_difference((*root)->lptr) >= 1)
			*root = leftLeftRotate(*root);
		else
			*root = leftRightRotate(*root);
	} else if(height_diff <= -2){
		if(height_difference((*root)->rptr) <= -1)
			*root = rightRightRotate(*root);
		else
			*root = rightLeftRotate(*root);
	} else{
		*root = *root;
	}
}
Example #2
0
/**
  *				 root
  *				  /		    	    root
  *				 v		    	    /                   root
  *				5		    	     v                      /
  *			 /  \		    	  5                      v
  *		 1	   10  --->  /  \     --->          8
  *			    /	 \    	3    8                 /  \
  *			   8    15   /      \               5    10
  *       /         1       10             /  \    \
  *      3                    \           1    3    15
  *                           15
  *
  *
  *
  *
  *
  */
void test_rightLeftRotate_rotate_6_elements_with_left_grand_left_child(void){
	setNode(&node1, NULL, NULL, 'b');
	setNode(&node3, NULL, NULL, 'b');
	setNode(&node8, &node3, NULL, 'b');
	setNode(&node5, &node1, &node10, 'b');
	setNode(&node15, NULL, NULL, 'b');
	setNode(&node10, &node8, &node15, 'b');
	Node *root = &node5;
	
	rightLeftRotate(&root);
	
	TEST_ASSERT_EQUAL_PTR(node1.left, NULL);
	TEST_ASSERT_EQUAL_PTR(node1.right, NULL);
	TEST_ASSERT_EQUAL_PTR(node3.left, NULL);
	TEST_ASSERT_EQUAL_PTR(node3.right, NULL);
	TEST_ASSERT_EQUAL_PTR(node5.left, &node1);
	TEST_ASSERT_EQUAL_PTR(node5.right, &node3);
	TEST_ASSERT_EQUAL_PTR(node8.left, &node5);
	TEST_ASSERT_EQUAL_PTR(node8.right, &node10);
	TEST_ASSERT_EQUAL_PTR(node10.left, NULL);
	TEST_ASSERT_EQUAL_PTR(node10.right, &node15);
	TEST_ASSERT_EQUAL_PTR(node15.left, NULL);
	TEST_ASSERT_EQUAL_PTR(node15.right, NULL);
	TEST_ASSERT_EQUAL_PTR(root, &node8);
	
}
Example #3
0
void restructureUnBalanceTreeWithoutColourFlopping( Node **rootPtr){
  Node *root = *rootPtr;

  if( root->left && !(root->right) ){
     if( root->left->left && !(root->left->right) )
        rightRotate(&(*rootPtr));
     else if( root->left->right && !(root->left->left) )
        leftRightRotate(&(*rootPtr));    
  }
  else if(root->right  && !(root->left)  ){
    if( root->right->right  && !(root->right->left) )
      leftRotate(&(*rootPtr));
    else if( root->right->left && !(root->right->right) )
      rightLeftRotate(&(*rootPtr));   
  }
}
Example #4
0
/**
  *				 root
  *				  /		    	      root
  *				 v		    	      /                     root
  *				5		    	       v                        /
  *			   \  	    	    5                        v
  *			    10    --->     \       --->          7
  *			   /	              7                   / \
  *			  7                  \                 5   10
  *                           10
  *
  *
  */
void test_rightLeftRotate_rotate_3_elements(void){
	setNode(&node7, NULL, NULL, 'b');
	setNode(&node5, NULL, &node10, 'b');
	setNode(&node10, &node7, NULL, 'b');
	Node *root = &node5;
	
	rightLeftRotate(&root);
	
	TEST_ASSERT_EQUAL_PTR(node5.left, NULL);
	TEST_ASSERT_EQUAL_PTR(node5.right, NULL);
	TEST_ASSERT_EQUAL_PTR(node7.left, &node5);
	TEST_ASSERT_EQUAL_PTR(node7.right, &node10);
	TEST_ASSERT_EQUAL_PTR(node10.left, NULL);
	TEST_ASSERT_EQUAL_PTR(node10.right, NULL);
	TEST_ASSERT_EQUAL_PTR(root, &node7);
	
}
Example #5
0
void solveAddViolationForNewNodeMoreThan(Node **nodePtr)
{
  if((*nodePtr)->right->right != NULL) {
    if(((*nodePtr)->right->color == 'r' && (*nodePtr)->right->right->color == 'r' && (*nodePtr)->left == NULL) ||
      ((*nodePtr)->right->color == 'r' && (*nodePtr)->right->right->color == 'r' && (*nodePtr)->left->color == 'b')){
      
      leftRotate(&(*nodePtr));
      (*nodePtr)->left->color = 'r';
    
    } 
  } else if ((*nodePtr)->right->left != NULL) {
      if(((*nodePtr)->right->color == 'r' && (*nodePtr)->right->left->color == 'r' && (*nodePtr)->left == NULL) || 
        ((*nodePtr)->right->color == 'r' && (*nodePtr)->right->left->color == 'r' && (*nodePtr)->left->color == 'b')){
       
        rightLeftRotate(&(*nodePtr));
        (*nodePtr)->left->color = 'r';
      
      }
   }
}  
Example #6
0
void restructureUnBalanceTree( Node **rootPtr){
  Node *root = *rootPtr;

  if( root->left && !(root->right) ){
     if( root->left->left && !(root->left->right) ){
        rightRotate(&(*rootPtr));
        (*rootPtr)->right->color = 'r';
     }else if( root->left->right && !(root->left->left) ){
        leftRightRotate(&(*rootPtr));
        (*rootPtr)->right->color = 'r';
      }      
  }
  else if(root->right  && !(root->left)  ){
    if( root->right->right  && !(root->right->left) ){
      leftRotate(&(*rootPtr));
      (*rootPtr)->left->color = 'r';
    }else if( root->right->left && !(root->right->right) ){
      rightLeftRotate(&(*rootPtr));
      (*rootPtr)->left->color = 'r';
     }       
  }
}
Example #7
0
AVLTree rotate(AVLTree adjustNode){
    
    enum RoateType type = getRoateType(adjustNode);
    AVLTree newNode = adjustNode;
    switch (type) {
        case RotateLeft:
            newNode = leftRotate(adjustNode);
            break;
        case RotateRight:
            newNode = rightRotate(adjustNode);
            break;
        case RotateLeftRight:
            newNode = leftRightRotate(adjustNode);
            break;
        case RotateRightLeft:
            newNode = rightLeftRotate(adjustNode);
            break;
        default:
            break;
    }

    return newNode;
}