You are on page 1of 32

AVL Trees

ITCS6114 Algorithms and Data Structures

Balanced and unbalanced BST


1
2 3 4 4 5 2

4
5

3
Is this balanced?

2
1 3 5

6
7
AVL Trees

6
7
2

Perfect Balance
Want a complete tree after every operation
tree is full except possibly in the lower right

This is expensive
For example, insert 2 in the tree on the left and then rebuild as a complete tree
6 5

4
1 5 8

Insert 2 & complete tree

2
4 6

8
9
3

1
AVL Trees

AVL - Good but not Perfect Balance


AVL trees are height-balanced binary search trees Balance factor of a node
height(left subtree) - height(right subtree)

An AVL tree has balance factor calculated at every node


For every node, heights of left and right subtree can differ by no more than 1 Store current heights in each node
AVL Trees 4

Node Heights
Tree A (AVL) height=2 BF=1-0=1 Tree B (AVL) 2

6
1 0 1

6
1

4
0 0

9
0

4
0 0

9 5 8

height of node = h balance factor = hleft-hright empty height = -1


AVL Trees 5

Node Heights after Insert 7


Tree A (AVL) 2 Tree B (not AVL) 3

6
1 1 1

6 4
0 0 1

balance factor 1-(-1) = 2

4
0 0 0

9 5

9
-1

5
0

height of node = h balance factor = hleft-hright empty height = -1


AVL Trees

Insert and Rotation in AVL Trees


Insert operation may cause balance factor to become 2 or 2 for some node
only nodes on the path from insertion point to root node have possibly changed in height So after the Insert, go back up to the root node by node, updating heights If a new balance factor (the difference hlefthright) is 2 or 2, adjust tree by rotation around the node
AVL Trees 7

Single Rotation in an AVL Tree


2 2

6
1 2 1

6
1

4
0 0 1

9
0

4
0

8
0
0

5
0

8 7

AVL Trees

Insertions in AVL Trees


Let the node that needs rebalancing be . There are 4 cases: Outside Cases (require single rotation) : 1. Insertion into left subtree of left child of . 2. Insertion into right subtree of right child of . Inside Cases (require double rotation) : 3. Insertion into right subtree of left child of . 4. Insertion into left subtree of right child of .

The rebalancing is performed through four separate rotation algorithms.


AVL Trees 9

AVL Insertion: Outside Case


Consider a valid AVL subtree

j
h h

k
h

Z
10

Y
AVL Trees

AVL Insertion: Outside Case

j k
h+1 h h

Inserting into X destroys the AVL property at node j

Y
X
AVL Trees 11

AVL Insertion: Outside Case

j k
h+1 h

Do a right rotation

Y
X
AVL Trees 12

Single right rotation

j k
h+1 h

Do a right rotation

Y
X
AVL Trees 13

Outside Case Completed

k
h+1
h

Right rotation done! (Left rotation is mirror symmetric)

j
h

Y
AVL Trees

Z
14

AVL property has been restored!

AVL Insertion: Inside Case


Consider a valid AVL subtree

j
h h

k
h

Z
15

Y
AVL Trees

AVL Insertion: Inside Case


Inserting into Y destroys the AVL property at node j

j
k
h+1

Does right rotation restore balance?


h

Y
AVL Trees 16

AVL Insertion: Inside Case

k
h

j
h+1

Right rotation does not restore balance now k is out of balance


h

X Y

Z
AVL Trees 17

AVL Insertion: Inside Case


Consider the structure of subtree Y

j
h h+1

k
h

Y
AVL Trees 18

AVL Insertion: Inside Case


Y = node i and subtrees V and W

j
h

k
h

X
V

h+1

h or h-1

W
AVL Trees 19

AVL Insertion: Inside Case

j k i V

We will do a left-right double rotation . . .

W
AVL Trees 20

Double rotation : first rotation

j i k W X V
AVL Trees

left rotation complete

21

Double rotation : second rotation

j i k W X V
AVL Trees

Now do a right rotation

22

Double rotation : second rotation


right rotation complete

i k
h h or h-1

Balance has been restored

j
h

W
AVL Trees

Z
23

Implementation
balance (1,0,-1) key left right

No need to keep the height; just the difference in height, i.e. the balance factor; this has to be modified on the path of insertion even if you dont perform rotations Once you have performed a rotation (single or double) you wont need to go back up the tree
AVL Trees 24

Insertion in AVL Trees


Insert at the leaf (as for all BST)
only nodes on the path from insertion point to root node have possibly changed in height So after the Insert, go back up to the root node by node, updating heights If a new balance factor (the difference hlefthright) is 2 or 2, adjust tree by rotation around the node
AVL Trees 25

Insert in AVL trees


Insert(T : reference tree pointer, x : element) : { if T = null then {T := new tree; T.data := x; height := 0; return;} case T.data = x : return ; //Duplicate do nothing T.data > x : Insert(T.left, x); if ((height(T.left)- height(T.right)) = 2){ if (T.left.data > x ) then //outside case T = RotatefromLeft (T); else //inside case T = DoubleRotatefromLeft (T);} T.data < x : Insert(T.right, x); code similar to the left case Endcase T.height := max(height(T.left),height(T.right)) +1; return; }
AVL Trees 26

Example of Insertions in an AVL Tree


2

20
0 1

Insert 5, 40 0

10
0

30 25 35

AVL Trees

27

Example of Insertions in an AVL Tree


2

20
1 1 1

20 30
0

10
0
0

30
0

10
0

25

35

5
Now Insert 45

25

35
0

40

AVL Trees

28

Single rotation (outside case)


3

20
1 2 1

20 30
0

10
0
0

30
2

10
0

25
Imbalance

35
1 40 0 45
AVL Trees

25
0

40 1
0

35
Now Insert 34
29

45

Double rotation (inside case)


3

20
1 3 1

20 35
1 0 25

10
0
0 Imbalance 25

30
2

10
0

40
1 35

5 45 0

30 34

40 1
0

45

Insertion of 34 0

34
AVL Trees 30

AVL Tree Deletion


Similar but more complex than insertion
Rotations and double rotations needed to rebalance Imbalance may propagate upward so that many rotations may be needed.

AVL Trees

31

Pros and Cons of AVL Trees


Arguments for AVL trees:
1. Search is O(log N) since AVL trees are always balanced. 2. Insertion and deletions are also O(logn) 3. The height balancing adds no more than a constant factor to the speed of insertion.

Arguments against using AVL trees:


1. Difficult to program & debug; more space for balance factor. 2. Asymptotically faster but rebalancing costs time. 3. Most large searches are done in database systems on disk and use other structures (e.g. B-trees).

AVL Trees

32

You might also like