Definition 1
Concept: On the basis of the BST (binary search tree), based on a height difference between any nodes left and right subtrees (equilibrium factor) of the absolute value is not more than 1.
AVL to create a name taken from the Soviet mathematician (GMAdelse-Velskil and EMLandis) before it two.
2 Basic Operation
2.1 storage structure
struct node{
int data;
int height;
node * lchild, * rchild;
} ;
New node 2.2
node* newNode ( int v) {
node* Node = new node;
Node- > data = v;
Node- > height = 1 ;
Node- > lchild = Node- > rchild = NULL ;
return Node;
}
2.3 to get to the root of the root of the current sub-tree height
int getHeight ( node* root) {
if ( root == NULL ) return 0 ;
return root- > height;
}
2.4 balance factor calculated root
int getBalandeFactor ( node* root) {
return getHeight ( root- > lchild) - getHeight ( root- > rchild) ;
}
2.5 update root of height
void updateHeight ( node* root) {
root- > height = max ( getHeight ( root- > lchild) , getHeight ( root- > rchild) ) + 1 ;
}
2.6 the insertion node
2.6.1 single left rotation
void L ( node* & root) {
node* temp = root- > rchild;
root- > rchild = temp- > lchild;
temp- > lchild = root;
updateHeight ( root) ;
updateHeight ( temp) ;
root = temp;
}
2.6.2 Right single rotation
void R ( node* & root) {
node* temp = root- > lchild;
root- > lchild = temp- > rchild;
temp- > rchild = root;
updateHeight ( root) ;
updateHeight ( temp) ;
root = temp;
}
2.6.3 insertion node
void Insert ( node* & root, int v) {
if ( root == NULL ) {
root = newNode ( v) ;
return ;
}
if ( v < root- > data) {
Insert ( root- > lchild, v) ;
updateHeight ( root) ;
if ( getBalandeFactor ( root) == 2 ) {
if ( getBalandeFactor ( root- > lchild) == 1 ) {
R ( root) ;
} else if ( getBalandeFactor ( root- > lchild) == - 1 ) {
L ( root- > lchild) ;
R ( root) ;
}
}
} else {
Insert ( root- > rchild, v) ;
updateHeight ( root) ;
if ( getBalandeFactor ( root) == - 2 ) {
if ( getBalandeFactor ( root- > rchild) == - 1 ) {
L ( root) ;
} else if ( getBalandeFactor ( root- > rchild) == 1 ) {
R ( root- > rchild) ;
L ( root) ;
}
}
}
2.7 create AVL tree
node* Create ( int data[ ] , int n) {
node* root = NULL ;
for ( int i = 0 ; i < n; ++ i)
{
Insert ( root, data[ i] ) ;
}
return root;
}
2.8 Find node value
void Search ( node* root, int x) {
if ( root == NULL ) {
printf ( "Search fail!\n" ) ;
return ;
}
if ( x == root- > data) {
printf ( "%d\n" , root- > data) ;
} else if ( x < root- > data) {
Search ( root- > lchild, x) ;
} else {
Search ( root- > rchild, x) ;
}
}
3.0 The complete code
#include <cstdio>
#include <algorithm>
using std:: max;
struct node{
int data, height;
node * lchild, * rchild;
} ;
node* newNode ( int v) {
node* Node = new node;
Node- > data = v;
Node- > height = 1 ;
Node- > lchild = Node- > rchild = NULL ;
return Node;
}
int getHeight ( node* root) {
if ( root == NULL ) return 0 ;
return root- > height;
}
int getBalandeFactor ( node* root) {
return getHeight ( root- > lchild) - getHeight ( root- > rchild) ;
}
void updateHeight ( node* root) {
root- > height = max ( getHeight ( root- > lchild) , getHeight ( root- > rchild) ) + 1 ;
}
void Search ( node* root, int x) {
if ( root == NULL ) {
printf ( "Search fail!\n" ) ;
return ;
}
if ( x == root- > data) {
printf ( "%d\n" , root- > data) ;
} else if ( x < root- > data) {
Search ( root- > lchild, x) ;
} else {
Search ( root- > rchild, x) ;
}
}
void L ( node* & root) {
node* temp = root- > rchild;
root- > rchild = temp- > lchild;
temp- > lchild = root;
updateHeight ( root) ;
updateHeight ( temp) ;
root = temp;
}
void R ( node* & root) {
node* temp = root- > lchild;
root- > lchild = temp- > rchild;
temp- > rchild = root;
updateHeight ( root) ;
updateHeight ( temp) ;
root = temp;
}
void Insert ( node* & root, int v) {
if ( root == NULL ) {
root = newNode ( v) ;
return ;
}
if ( v < root- > data) {
Insert ( root- > lchild, v) ;
updateHeight ( root) ;
if ( getBalandeFactor ( root) == 2 ) {
if ( getBalandeFactor ( root- > lchild) == 1 ) {
R ( root) ;
} else if ( getBalandeFactor ( root- > lchild) == - 1 ) {
L ( root- > lchild) ;
R ( root) ;
}
}
} else {
Insert ( root- > rchild, v) ;
updateHeight ( root) ;
if ( getBalandeFactor ( root) == - 2 ) {
if ( getBalandeFactor ( root- > rchild) == - 1 ) {
L ( root) ;
} else if ( getBalandeFactor ( root- > rchild) == 1 ) {
R ( root- > rchild) ;
L ( root) ;
}
}
}
}
node* Create ( int data[ ] , int n) {
node* root = NULL ;
for ( int i = 0 ; i < n; ++ i)
{
Insert ( root, data[ i] ) ;
}
return root;
}
int main ( int argc, char const * argv[ ] )
{
int tree[ 7 ] = { 100 , 80 , 60 , 90 , 120 , 130 , 110 } ;
node* root = Create ( tree, 7 ) ;
Search ( root, 110 ) ;
Search ( root, 1 ) ;
return 0 ;
}