Пример #1
0
avl insert(avl a, int v)
{
	if(!a)
		return new_node(v);
	if(v < a->val && !a->left){
		a->left = new_node(v);
		a->h++;
	}
	if(v > a->val && !a->right){
		a->right = new_node(v);
		a->h++;
	}
	if(v < a->val ){
		a->left = insert(a->left, v);
		if(a->left->h - a->right->h > 1){
			if(v < a->left->val )
				a->left = single_left_rotate(a);
			else
				a->left = double_left_rotate(a);
		}
	}
	if(v > a->val){
		a->right = insert(a->right,v);
		if(a->left->h - a->right->h > 1){
			if(v > a->right->val)
				a->right = single_right_rotate(a);
			else
				a->right = double_right_rotate(a);
		}
	}
	a->h = max(height(a->left),height(a->right))+1;
	return a;
}
Пример #2
0
void insert_avl(TREE_NODE** t, void *data, comparator comparator, int line ){
  int *line_number = malloc(sizeof(int));
  *line_number = line;
  if(!*t){//insert new node in tree
    *t = (TREE_NODE*)malloc(sizeof(TREE_NODE));
    (*t)->data = data;
    append(&( ( (W_TOKEN *)( (*t)->data ) )->list ), line_number);
    (*t)->height = 0;
    (*t)->left = (*t)->right = NULL;
  }
  else if (comparator(data , (*t)->data) < 0 ){
    insert_avl( &((*t)->left), data, comparator, line );
    if( height( (*t)->left ) - height( (*t)->right ) == 2 ){
      if (comparator(data , (*t)->left->data) < 0 ){
        *t = rotate_left( *t );
      }
      else if (comparator(data , (*t)->left->data) > 0 ){
        *t = double_left_rotate( *t );
      }
    }
  }
  else if (comparator(data , (*t)->data) > 0 ){
    insert_avl( &( (*t)->right ), data, comparator, line );
    if( height( (*t)->right ) - height( (*t)->left ) == 2 ){
      if (comparator(data , (*t)->right->data) > 0 ){
        *t = rotate_right( *t );
      }
      else if (comparator(data , (*t)->right->data) < 0 ){
        *t = double_right_rotate( *t );
      }
    }
  }
  else{//word already in tree, add line number to list
    append(&( ( (W_TOKEN *)( (*t)->data ) )->list ), line_number);
  }

  (*t)->height = max( height( (*t)->left ), height( (*t)->right ) ) + 1;
}