AVL Trees Lecture-Advanced Data Structures
AVL Trees Lecture-Advanced Data Structures
AVL Trees Lecture-Advanced Data Structures
2
AVL Trees
o An AVL tree is a binary search tree (BST)
with a balance condition.
n Named after its inventors,
Adelson-Velskii and Landis.
3
AVL Trees, cont’d
6
Balancing AVL Trees, cont’d
o Let the deepest unbalanced node be α.
o Any node has at most two children.
o A new height imbalance means that the
heights of α’s two subtrees now differ by 2.
α α
1 2 3 4
7
Balancing AVL Trees, cont’d
o Therefore, one of the following α
had to occur:
n Case 1 (outside left-left):
The insertion was into the
left subtree of the left child of α. 1 2 3 4
n Case 2 (inside left-right): The insertion was into the
right subtree of the left child of α.
n Case 3 (inside right-left): The insertion was into the
left subtree of the right child of α.
n Case 4 (outside right-right): The insertion was into
the right subtree of the right child of α.
Node 8 is unbalanced.
Single right rotation: 8's left
child 7 becomes the new
root of the subtree.
Node 8 is the right child.
http://www.cs.uah.edu/~rcoleman/CS221/Trees/AVLTree.htm
l
Data Structures and Algorithms in Java, 3rd ed. 10
by Mark Allen Weiss
Pearson Education, Inc., 2012
Balancing AVL Trees: Case 4
o Case 4 (outside right-right):
Rebalance with a single left rotation.
Node A is unbalanced.
Single left rotation: A's right
child C becomes the new
root of the subtree.
Node A becomes the left
child and adopts C's left child
as its new right child. 11
http://www.cs.uah.edu/~rcoleman/CS221/Trees/AVLTree.htm
Balancing AVL Trees: Case 2
o Case 2 (inside left-right):
Rebalance with a double left-right rotation.
http://www.cs.uah.edu/~rcoleman/CS221/Trees/AVLTree.htm
l
Node A is unbalanced.
Double left-right rotation: E becomes the new root of the subtree after two
rotations. Step 1 is a single left rotation between B and E. E replaces B as the
subtree root. B becomes E's left child and B adopts E's left child F as its new
right child. Step 2 is a single right rotation between E and A. E replaces A is
the subtree root. A becomes E's right child and A adopts E's right child G as its
new left child. 13
Balancing AVL Trees: Case 3
o Case 3 (inside right-left):
Rebalance with a double right-left rotation.
Node A is unbalanced.
Double right-left rotation: D becomes the new root of the subtree after two
rotations. Step 1 is a single right rotation between C and C. D replaces C as
the subtree root. C becomes D's right child and C adopts D's right child G as
its new left child. Step 2 is a single left rotation between D and A. D replaces A
is the subtree root. A becomes D's left child and A adopts D's left child F as its
new right child. 15
AVL Tree Implementation
o Since an AVL tree is just a BST with a balance
condition, it makes sense to make the AVL tree
class a subclass of the BST class.
public class AvlTree extends BinarySearchTree
o Both classes can share the same
BinaryNode class.
16
The AVL Tree Node
o With so many height calculations, it makes
sense to store each node's height in the node
itself.
public class BinaryNode
{
private int data; // data in this node
private int height; // height of this node
private BinaryNode left; // left child
private BinaryNode right; // right child
...
}
17
AVL Tree Implementation, cont’d
o Class AVLTree overrides the insert() and
remove() methods of class BinarySearchTree.
n Each method calls the superclass's method and
wraps the result in a call to the balance() method.
protected BinaryNode insert(int data, BinaryNode node)
{
return balance(super.insert(data, node));
}
18
AVL Tree Implementation, cont’d
o The private AVLTree method balance()
checks whether the balance condition still
holds, and rebalances the tree with rotations
whenever necessary.
19
AVL Tree Implementation, cont’d
private BinaryNode balance(BinaryNode node)
{
...
if (height(node.getLeft()) - height(node.getRight()) > 1) {
if (height(node.getLeft().getLeft())
>= height(node.getLeft().getRight())) {
node = singleRightRotation(node);
}
Case 1
else {
node = doubleLeftRightRotation(node);
} Case 2
}
else if (height(node.getRight()) - height(node.getLeft()) > 1) {
if (height(node.getRight().getRight())
>= height(node.getRight().getLeft())) {
node = singleLeftRotation(node);
}
Case 4
else {
node = doubleRightLeftRotation(node);
} Case 3
}
...
return node;
}
20
AVL Tree Implementation, cont’d
private BinaryNode singleRightRotation(BinaryNode k2)
{ Case 1
BinaryNode k1 = k2.getLeft();
k2.setLeft(k1.getRight());
k1.setRight(k2);
k2.setHeight(Math.max(height(k2.getLeft()), height(k2.getRight())) + 1);
k1.setHeight(Math.max(height(k1.getLeft()), k2.getHeight()) + 1);
return k1;
}
return k2;
}
21
AVL Tree Implementation, cont’d
private BinaryNode doubleLeftRightRotation(BinaryNode k3)
{
k3.setLeft(singleLeftRotation(k3.getLeft()));
Case 2
return singleRightRotation(k3);
}
22
Break
23
Assignment #3
o This assignment will give you practice with
binary search trees (BST) and AVL trees.
o You are provided a TreePrinter class that
has a print() method that will print any
arbitrary binary tree.
n A template for how it prints a tree:
xx
/\
------------------------------ ------------------------------
/ \
xx xx
/\ /\
-------------- -------------- -------------- --------------
/ \ / \
xx xx xx xx
/\ /\ /\ /\
------ ------ ------ ------ ------ ------ ------ ------
/ \ / \ / \ / \
xx xx xx xx xx xx xx xx
/\ /\ /\ /\ /\ /\ /\ /\
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
/ \ / \ / \ / \ / \ / \ / \ / \
xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
/\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx24xx
xx
Assignment #3, cont’d
o TreePrinter is able to print trees with height
up to 5, i.e., 32 node values on the bottom row.
n An example of an actual printed tree:
TreePrinter.ja
24
/\ va
-------------- --------------
/ \
18 73
/\ /\
------ ------ ------ ------
/ \ / \
12 19 38 87
/ /\ \
-- -- -- --
/ / \ \
10 37 41 90
\
\
64
25
Assignment #3: First Part
o The first part of the assignment makes sure that
you can successfully insert nodes into, and
delete nodes from, a binary search tree (BST)
and an AVL tree.
26
Assignment #3: First Part, cont’d
o First generate a random BST that has height 5
and contains random values from 10 through 99.
n You may have to generate dozens of trees
until you get one that's exactly height 5.
n Don't worry that the tree is unbalanced.
n Print the tree.
27
Assignment #3: First Part, cont’d
o Second, create an AVL tree node by node.
n Generate 35 unique random integers 10-99
to insert into the tree.
n Print the tree after each insertion to verify that
you are keeping it balanced.
n Each time you do a rebalancing, print a message
indicating which rotation operation and which node.
o Example:
Double left-right rotation: 76
o As you did with the BST, repeatedly delete the
root of your AVL tree.
n Print the tree after each deletion to verify that
you are keeping it balanced.
28
Assignment #3: First Part, cont’d
o A handy AVL tree balance checker:
private int checkBalance(BinaryNode node) throws Exception
{
if (node == null) return -1;
if (node != null) {
int leftHeight = checkBalance(node.getLeft());
int rightHeight = checkBalance(node.getRight());
if ( (Math.abs(height(node.getLeft()) - height(node.getRight())) > 1
)
|| (height(node.getLeft()) != leftHeight)
|| (height(node.getRight()) != rightHeight)) {
throw new Exception("Unbalanced trees.");
}
}
return height(node);
}
Demo 29
Assignment #3: Second Part
o The second part of the assignment compares
the performance of a BST vs. an AVL tree.
30
Assignment #3: Second Part
o First, generate n random integers.
n n is some large number, explained on the next slide.
31
Assignment #3: Second Part, cont’d
o Choose a value of n large enough to give you
consistent timings that you can compare.
n Try values of n = 1,000 10,000 100,000 1,000,000
32
Assignment #3: Second Part, cont’d
o Second, generate k random integers.
n k is some large value.
33
Assignment #3: Second Part, cont’d
o Third, perform a random mixture of m insertions
and searches on your BST and then on your
n-node AVL tree.
n m is some large number.
n Perform the same sequence of insertions and
searches on both trees.
35
Assignment #3, cont’d
o You may choose a partner to work with you
on this assignment.
n Both of you will receive the same score.
36
Assignment #3, cont’d
o Email the zip file to me
n Subject line:
CS 146 Assignment #3: Your Name(s)
37
Splay Trees
o Not a new type of tree, but a reimplementation
of the BST insert, delete, and search methods.
n The goal is to improve their performance.
38
Splay Trees, cont’d
o Whenever a splay tree node is accessed,
the tree performs splaying operations that
moves the accessed node to the root of the tree.
o Splaying a node consists of a series of rotations.
n Similar to AVL tree rotations.
39
Splay Trees, cont’d
o The theory is that once a node has been
accessed, it will soon be accessed again.
o Future accesses are fast if the node is the root.
40
Splay Trees, cont’d
o How is a worst-case BST created ?
n When all the nodes are entered in sorted order.
n Suppose the bottom node is accessed in such a tree:
42
Splay Trees, cont’d