AVL Tree
AVL Tree
AVL Tree
It is one of the types of the binary tree, or we can say that it is a variant of
the binary search tree. AVL tree satisfies the property of the binary tree as well
as of the binary search tree. It is a self-balancing binary search tree that was
invented by Adelson Velsky Lindas. Here, self-balancing means that balancing the
heights of left subtree and right subtree. This balancing is measured in terms of
the balancing factor.
We can consider a tree as an AVL tree if the tree obeys the binary search tree as
well as a balancing factor. The balancing factor can be defined as the difference
between the height of the left subtree and the height of the right subtree. The
balancing factor's value must be either 0, -1, or 1; therefore, each node in the
AVL tree should have the value of the balancing factor either as 0, -1, or 1.
Most of the BST operations (e.g., search, max, min, insert, delete.. etc) take O(h)
time where h is the height of the BST. The cost of these operations may become O(n)
for a skewed Binary tree. If we make sure that height of the tree remains O(Logn)
after every insertion and deletion, then we can guarantee an upper bound of O(Logn)
for all these operations. The height of an AVL tree is always O(Logn) where n is
the number of nodes in the tree (See this video lecture for proof).
Insertion
To make sure that the given tree remains AVL after every insertion, we must augment
the standard BST insert operation to perform some re-balancing. Following are two
basic operations that can be performed to re-balance a BST without violating the
BST property (keys(left) < key(root) < keys(right)).
1) Left Rotation
2) Right Rotation
z z x
/ \ / \ / \
y T4 Left Rotate (y) x T4 Right Rotate(z) y z
/ \ - - - - - - - - -> / \ - - - - - - - -> / \ / \
T1 x y T3 T1 T2 T3 T4
/ \ / \
T2 T3 T1 T2
c) Right Right Case
z y
/ \ / \
T1 y Left Rotate(z) z x
/ \ - - - - - - - -> / \ / \
T2 x T1 T2 T3 T4
/ \
T3 T4
d) Right Left Case
z z x
/ \ / \ / \
T1 y Right Rotate (y) T1 x Left Rotate(z) z y
/ \ - - - - - - - - -> / \ - - - - - - - -> / \ / \
x T4 T2 y T1 T2 T3 T4
/ \ / \
T2 T3 T3 T4
Node(int d) {
key = d;
height = 1;
}
}
class AVLTree {
Node root;
// Perform rotation
x.right = y;
y.left = T2;
// Update heights
y.height = max(height(y.left), height(y.right)) + 1;
x.height = max(height(x.left), height(x.right)) + 1;
// Perform rotation
y.left = x;
x.right = T2;
// Update heights
x.height = max(height(x.left), height(x.right)) + 1;
y.height = max(height(y.left), height(y.right)) + 1;