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; }
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; }