AVL Tree is a tree data structure whose height is always balanced by rotation tree nodes.
[AVL Tree example]
source code : AVL_tree.cpp
#include <stdio.h> #include <stdlib.h> #define max(a,b) (((a) > (b)) ? (a) : (b)) typedef struct AvlNode { int data; AvlNode *left_child, *right_child; }AvlNode; AvlNode *root; AvlNode* rotate_LL(AvlNode *parent) { AvlNode *child = parent->left_child; parent->left_child = child->right_child; child->right_child = parent; return child; } AvlNode* rotate_RR(AvlNode *parent) { AvlNode *child = parent->right_child; parent->right_child = child->left_child; child->left_child = parent; return child; } AvlNode* rotate_RL(AvlNode *parent) { AvlNode *child = parent->right_child; parent->right_child = rotate_LL(child); return rotate_RR(parent); } AvlNode* rotate_LR(AvlNode *parent) { AvlNode *child = parent->left_child; parent->left_child = rotate_RR(child); return rotate_LL(parent); } int get_height(AvlNode *node) { int height=0; if(node != NULL) height = 1+max(get_height(node->left_child),get_height(node->right_child)); return height; } int get_balance(AvlNode *node) { if(node == NULL) return 0; return get_height(node->left_child) - get_height(node->right_child); } AvlNode* balance_tree(AvlNode **node) { int height_diff= get_balance(*node); if(height_diff > 1)
{
if(get_balance((*node)->left_child) > 0)
*node = rotate_LL(*node);
else
*node = rotate_LR(*node);
}
else if(height_diff < -1)
{
if(get_balance((*node)->right_child) < 0)
*node = rotate_RR(*node);
else
*node = rotate_RL(*node);
}
return *node;
}
AvlNode* avl_add(AvlNode **root,int key)
{
if(*root == NULL)
{
*root = (AvlNode*)malloc(sizeof(AvlNode));
if(*root == NULL)
{
printf("fail: memory allocation\n");
exit(-1);
}
(*root)->data = key;
(*root)->left_child = (*root)->right_child = NULL;
}
else if(key < (*root)->data)
{
(*root)->left_child = avl_add(&((*root)->left_child),key);
(*root) = balance_tree(root);
}
else if(key > (*root)->data)
{
(*root)->right_child = avl_add(&((*root)->right_child), key);
(*root) = balance_tree(root);
}
else
{
printf("fail! - duplicated key\n");
exit(-1);
}
return *root;
}
AvlNode* avl_search(AvlNode *node, int key)
{
if(node == NULL) return NULL;
printf("%d->",node->data);
if(key == node->data)
return node;
else if(key < node->data)
avl_search(node->left_child,key);
else
avl_search(node->right_child,key);
}
int main()
{
avl_add(&root,8);
avl_add(&root,9); avl_add(&root,10); avl_add(&root,2); avl_add(&root,1); avl_add(&root,5); avl_add(&root,3); avl_add(&root,6); avl_add(&root,4); avl_add(&root,7); avl_add(&root,11); avl_add(&root,12); avl_search(root,12); return 0; }