#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");}