# include <stdio.h>
# include <stdlib.h>
# define max ( a, b) ( ( a > b) ? ( a) : ( b) )
typedef struct AVL_TreeNode { int data; struct AVL_TreeNode * l; struct AVL_TreeNode * r; int h;
} avlNode, * avlTree;
avlNode* createNode ( int key, avlNode* l, avlNode* r) { avlNode* node = ( avlNode* ) malloc ( sizeof ( avlNode) ) ; node-> l = l; node-> r = r; node-> data = key; node-> h = 0 ; return node;
}
int get_h ( avlNode* node) { if ( node == NULL ) { return 0 ; } else { return node-> h; }
}
avlNode* RR ( avlNode* x) { avlNode* y = x-> r; x-> r = y-> l; y-> l = x; x-> h = max ( get_h ( x-> l) , get_h ( x-> r) ) + 1 ; y-> h = max ( get_h ( y-> l) , get_h ( y-> r) ) + 1 ; return y;
}
avlNode* LL ( avlNode* x) { avlNode* y = x-> l; x-> l = y-> r; y-> r = x; x-> h = max ( get_h ( x-> l) , get_h ( x-> r) ) + 1 ; y-> h = max ( get_h ( y-> l) , get_h ( y-> r) ) + 1 ; return y;
}
avlNode* LR ( avlNode* x) { x-> l = RR ( x-> l) ; x = LL ( x) ; return x;
}
avlNode* RL ( avlNode* x) { x-> r = LL ( x-> r) ; x = RR ( x) ; return x;
}
avlTree insert_avlNode ( avlNode* tree, int key) { if ( tree == NULL ) { avlNode* node = createNode ( key, NULL , NULL ) ; tree = node; } else if ( key > tree-> data) { tree-> r = insert_avlNode ( tree-> r, key) ; if ( get_h ( tree-> r) - get_h ( tree-> l) > 1 ) { if ( key < tree-> data) { tree = RL ( tree) ; } else { tree = RR ( tree) ; } } } else if ( key < tree-> data) { tree-> l = insert_avlNode ( tree-> l, key) ; if ( get_h ( tree-> l) - get_h ( tree-> r) > 1 ) { if ( key < tree-> data) { tree = LL ( tree) ; } else { tree = LR ( tree) ; } } } tree-> h = max ( get_h ( tree-> l) , get_h ( tree-> r) ) + 1 ; return tree; } void in_order ( avlTree tree)
{ if ( tree) { in_order ( tree-> l) ; printf ( "%d " , tree-> data) ; in_order ( tree-> r) ; }
} int main ( )
{ avlTree tree = NULL ; int a[ 9 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } ; for ( int i = 0 ; i < 9 ; i++ ) { tree = insert_avlNode ( tree, a[ i] ) ; } in_order ( tree) ; printf ( "\n" ) ; }