예제 #1
0
파일: avl.c 프로젝트: zecarlos94/LI3_GZT
/*Faz a insercao a esquerda na AVL*/
AVL insertLeft(AVL p, void* info, int *cresceu,int tipo_AVL) {
	p->left=insert(p->left, info, cresceu,tipo_AVL);
	if(*cresceu) {
		switch(p->bf) {
		case RH:
			p->bf=EH;
			*cresceu=0;
			break;
		case EH:
			p->bf=LH;
			*cresceu=1;
			break;
		case LH:
			p=balanceLeft(p);
			*cresceu=0;
		}
	}
	return p;
}
예제 #2
0
Tree insertLeft(Tree t, TreeEntry e, int *cresceu) {

  t -> left = insertTree(t -> left, e, cresceu);

  if(*cresceu) {
    switch(t -> bf) {
      case RH:
        t -> bf = EH;
        *cresceu = 0;
        break;
      case EH:
        t -> bf = LH;
        *cresceu = 1;
        break;
      case LH:
        t = balanceLeft(t);
        *cresceu = 0;
    }
  }

  return t;
}
예제 #3
0
Tree deleteRight(Tree t, TreeEntry e, int *diminuiu) {

  t -> right = deleteTree(t->right, e, diminuiu);

  if(*diminuiu) {
    switch(t->bf) {
      case RH:
        t -> bf = EH;
        *diminuiu = 1;
        break;
      case EH:
        t -> bf =  LH;
        *diminuiu = 0;
        break;
      case LH:
        printf("[bL]\n");
        t = balanceLeft(t);
        *diminuiu = 1;
    }
  }

  return t;
}
예제 #4
0
파일: chkAvl.c 프로젝트: iamon3/C_DFS
avlTreeNode* insertNode(avlTreeNode* root , int key )
{
  if( !root )
    {
      printf("\nIn leaf Insertion\n");
      root = creatNode( key );
      return root;
    }
  
  if( root -> data == key )
    {
      printf("\nDuplicate Key Not permitted\n");
      return root;
    }
  
  else if( root -> data > key )
    {
      printf("\nBefore Left Insertion\n");
      root -> leftTree = insertNode( root -> leftTree , key ) ;
      printf("\nAfter Left Insertion\n");

      int balanceDifference;

      balanceDifference = calculateMaxHight( root );

      switch (balanceDifference) 
	{
	  
	case -15:
	  {
	    printf("\nDon have left and right child\n");
	    root -> leftTree -> height = 1;
	    root -> leftTree -> balanceFactor = EQ;
	    break;
	  }
	  

	case 0:
	  {
	    printf("\nBoth equal hight subtrees\n");
	    root -> height = 1 + ( root-> leftTree -> height ) ;
	    root -> balanceFactor = EQ ;
	    break;
	  }

	case 1:
	  {
	    /*	    printf("\nright subtree highted\n");*/
	    root -> height = 1 + (root -> leftTree -> height) ;
	    root -> balanceFactor = LH ;
	    break;
	  }
	
	case 2:
	  {
	    printf("\nLeft subtree highted calling balanceLeft\n");
	    root  = balanceLeft( root );
	    break;
	  }
	} 
	
      return root;
    }

  else
    {
      printf("\nBefore Rightt Insertion\n");
      root -> rightTree = insertNode( root -> rightTree , key ) ;
      printf("\nAfter Right Insertion\n");

      int balanceDifference;

      balanceDifference = calculateMaxHight( root );

      switch (balanceDifference) 
	{
	  
	case -15:
	  {
	    printf("\nDon have left and right child\n");
	    root -> rightTree -> height = 1;
	    root -> rightTree -> balanceFactor = EQ;
	    break;
	  }
	  

	case 0:
	  {
	    printf("\nBoth equal hight subtrees\n");
	    root -> height = 1 + ( root -> rightTree -> height ) ;
	    root -> balanceFactor = EQ ;
	    break;
	  }

	case -2:
	  {
	    printf("\nRight highted, calling balanceRight\n");
	    root  = balanceRight( root );
	    break;
	  }

	case -1:
	  {
	    /*	    printf("\nLeft subtree hightedt\n");*/
	    root -> height = 1 + ( root -> rightTree -> height );
	    root -> balanceFactor = RH ;
	    break;
	  }
	} 

      return root;
    }

  return root;
}