Ejemplo n.º 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;
	}
}
Ejemplo n.º 2
0
/**
  *				 root
  *				  /		    	    root
  *				 v		    	    /                   root
  *				10		    	   v                      /
  *			 /  \		    	  10                     v
  *			5	   15  --->  /  \     --->          7
  *		/  \	    	    7    15                /  \
  *	 1    7          /                      5    10
  *      /          5                      /  \    \
  *    6          /  \                   1    6    15
  *              1    6
  *
  *
  */
void test_leftRightRotate_rotate_6_elements_with_left_grand_left_child(void){
	setNode(&node1, NULL, NULL, 'b');
	setNode(&node6, NULL, NULL, 'b');
	setNode(&node7, &node6, NULL, 'b');
	setNode(&node5, &node1, &node7, 'b');
	setNode(&node15, NULL, NULL, 'b');
	setNode(&node10, &node5, &node15, 'b');
	Node *root = &node10;
	
	leftRightRotate(&root);
	
	TEST_ASSERT_EQUAL_PTR(node1.left, NULL);
	TEST_ASSERT_EQUAL_PTR(node1.right, NULL);
	TEST_ASSERT_EQUAL_PTR(node6.left, NULL);
	TEST_ASSERT_EQUAL_PTR(node6.right, NULL);
	TEST_ASSERT_EQUAL_PTR(node5.left, &node1);
	TEST_ASSERT_EQUAL_PTR(node5.right, &node6);
	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, &node15);
	TEST_ASSERT_EQUAL_PTR(node15.left, NULL);
	TEST_ASSERT_EQUAL_PTR(node15.right, NULL);
	TEST_ASSERT_EQUAL_PTR(root, &node7);
	
}
Ejemplo n.º 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));   
  }
}
Ejemplo n.º 4
0
/**
  *				 root
  *				  /		    	root
  *				 v		    	  /                   root
  *				10		    	 v                      /
  *			   /  		    10                     v
  *			  5	   --->   /        --->          7
  *			   \	    	 7                      / \
  *			    7       /                      5   10
  *                5
  *
  *
  */
void test_leftRightRotate_rotate_3_elements(void){
	setNode(&node7, NULL, NULL, 'b');
	setNode(&node5, NULL, &node7, 'b');
	setNode(&node10, &node5, NULL, 'b');
	Node *root = &node10;
	
	leftRightRotate(&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);
	
}
Ejemplo n.º 5
0
void solveAddViolationForNewNodeLessThan(Node **nodePtr)
{
  if((*nodePtr)->left->left != NULL) {
    if(((*nodePtr)->left->color == 'r' && (*nodePtr)->left->left->color == 'r' && (*nodePtr)->right == NULL) ||
       ((*nodePtr)->left->color == 'r' && (*nodePtr)->left->left->color == 'r' && (*nodePtr)->right->color == 'b')) {
     
      rightRotate(&(*nodePtr));
      (*nodePtr)->right->color = 'r';
    
    }
  } else if((*nodePtr)->left->right != NULL) {
      if(((*nodePtr)->left->color == 'r' && (*nodePtr)->left->right->color == 'r' && (*nodePtr)->right == NULL) ||
        ((*nodePtr)->left->color == 'r' && (*nodePtr)->left->right->color == 'r' && (*nodePtr)->right->color == 'b')) {
       
        leftRightRotate(&(*nodePtr));
        (*nodePtr)->right->color = 'r';
      
      }
    } 
}
Ejemplo n.º 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';
     }       
  }
}
Ejemplo n.º 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;
}