CSE 326: Data Structures AVL Trees Ben Lerner Summer 2007.

Post on 20-Dec-2015

221 views 1 download

Transcript of CSE 326: Data Structures AVL Trees Ben Lerner Summer 2007.

CSE 326: Data StructuresAVL Trees

Ben Lerner

Summer 2007

2

The AVL Balance ConditionLeft and right subtrees of every nodehave equal heights differing by at most 1

Define: balance(x) = height(x.left) – height(x.right)

AVL property: –1 balance(x) 1, for every node x

• Ensures small depth– Will prove this by showing that an AVL tree of height

h must have a lot of (i.e. O(2h)) nodes• Easy to maintain

– Using single and double rotations

3

The AVL Tree Data Structure

4

121062

115

8

14137 9

Structural properties

1. Binary tree property

2. Balance property:balance of every node isbetween -1 and 1

Result:

Worst case depth isO(log n)

Ordering property– Same as for BST

15

4

Is this an AVL tree?

2092

155

10

30177

(NULLs have height -1)

We need to be able to:

1. Track the balance

2. Detect imbalance

3. Restore balance

5

111

84

6

3

1171

84

6

2

5

How about these?

10 12

7

6

Height of an AVL Tree

• M(h) = minimum number of nodes in an AVL tree of height h.

• Basis– M(0) = 1, M(1) = 2

• Induction– M(h) = M(h-1) + M(h-2) + 1

• Solution– M(h) > h - 1 ( = (1+5)/2 1.62)

h-1h-2

h

7

Proof that M(h) > h

• Basis: M(0) = 1 > 0 -1, M(1) = 2 > 1-1

• Induction step.M(h) = M(h-1) + M(h-2) + 1 > (h-1 - 1) + (h-2 - 1) + 1 = h-1 + h-2 - 1 = h-2 ( +1) - 1 = h - 1 (Uses fact that 2 = +1)

8

Height of an AVL Tree

• M(h) > h ( 1.62)

• Suppose we have n nodes in an AVL tree of height h.– N > M(h) – N > h - 1

– log(N+1) > h (relatively well balanced tree!!)

9

Node Heights

1

00

2

0

6

4 9

81 5

1

height of node = hbalance factor = hleft-hright

empty height = -1

0

0

2

0

6

4 9

1 5

1

10

Node Heights after Insert 7

2

10

3

0

6

4 9

81 5

1

height of node = hbalance factor = hleft-hright

empty height = -1

1

0

2

0

6

4 9

1 5

1

0

7

0

7

balance factor 1-(-1) = 2

-1

11

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 (i.e. the difference

hleft-hright) is 2 or –2, adjust tree by rotation around the node

12

Single Rotation in an AVL Tree

2

10

2

0

6

4 9

81 5

1

0

7

0

1

0

2

0

6

4

9

8

1 5

1

0

7

13

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.

Insertions in AVL Trees

14

Bad Case #1

Insert(6)

Insert(3)

Insert(1)

Where is AVL property violated?

15

Fix: Apply Single Rotation

3

1 600

16

3

10

1

2

Single Rotation: 1. Rotate between x and child

AVL Property violated at this node (x)

16

j

k

X Y

Z

Consider a validAVL subtree

AVL Insertion: Outside Case

h

hh

17

j

k

XY

Z

Inserting into Xdestroys the AVL property at node j

AVL Insertion: Outside Case

h

h+1 h

18

j

k

XY

Z

Do a “rotation from left”

AVL Insertion: Outside Case

h

h+1 h

19

j

k

XY

Z

Single rotation from left

h

h+1 h

20

j

k

X Y Z

“rotation from left” done!(“rotation from right” is mirror symmetric)

Outside Case Completed

AVL property has been restored!

h

h+1

h

21

Single rotation example

21103

205

15

1

2 4

17

21

10

3 20

5

15

1

2

4

17

22

Bad Case #2

Insert(1)

Insert(6)

Insert(3)

Will single rotation fix? (No)(try bringing up Large; doesn’t work)

23

Fix: Apply Double Rotation

3

1 600

1

3

6

1

0

1

2

6

3

1

0

1

2

Balanced?

Intuition: 3 must become root

AVL Property violated at this node (x)

Double Rotation1. Rotate between x’s child and grandchild2. Rotate between x and x’s new child

24

j

k

X Y

Z

AVL Insertion: Inside Case

Consider a validAVL subtree

h

hh

25

Inserting into Y destroys theAVL propertyat node j

j

k

XY

Z

AVL Insertion: Inside Case

Does “rotation from left”restore balance?

h

h+1h

26

jk

X

YZ

“Rotation from left”does not restorebalance… now k isout of balance

AVL Insertion: Inside Case

hh+1

h

27

Consider the structureof subtree Y… j

k

XY

Z

AVL Insertion: Inside Case

h

h+1h

28

j

k

X

V

Z

W

i

Y = node i andsubtrees V and W

AVL Insertion: Inside Case

h

h+1h

h or h-1

29

j

k

X

V

Z

W

i

AVL Insertion: Inside Case

We will do a“double rotation” . . .

1

2

30

j

k

X V

ZW

i

Double rotation : first rotation

31

j

k

X V

ZW

i

Double rotation : second rotation

32

jk

X V ZW

i

Double rotation : second rotation

right rotation complete

Balance has been restored to the universe

hh h or h-1

33

Double rotation, step 1

104

178

15

3 6

16

5

106

178

15

4

3

16

5

34

Double rotation, step 2

106

178

15

4

3

16

5

10

6 17

8

15

4

3

16

5

35

Imbalance at node X

Single Rotation

1. Rotate between x and child

Double Rotation

1. Rotate between x’s child and grandchild

2. Rotate between x and x’s new child

36

Insert into an AVL tree: a b e c d

37

9

5

2

11

7

1. single rotation?

2. double rotation?

3. no rotation?

Inserting what integer values would cause the tree to need a:

Single and Double Rotations:

13

30

Student Activity

38

Insertion into AVL tree

1. Find spot for new key

2. Hang new node there with this key

3. Search back up the path for imbalance

4. If there is an imbalance:case #1: Perform single rotation and exit

case #2: Perform double rotation and exit

Both rotations keep the subtree height unchanged.Hence only one rotation is sufficient!

39

Easy Insert

2092

155

10

3017

Insert(3)

120

0

100

1 2

3

0

Unbalanced?

40

Hard Insert (Bad Case #1)

2092

155

10

3017

Insert(33)

3

121

0

100

2 2

3

00

How to fix?

Unbalanced?

41

Single Rotation

2092

155

10

30173

12

33

1

0

200

2 3

3

10

0

3092

205

10

333

151

0

110

2 2

3

001712

0

42

Hard Insert (Bad Case #2)

Insert(18)

2092

155

10

30173

121

0

100

2 2

3

00

How to fix?

Unbalanced?

43

Single Rotation (oops!)

2092

155

10

30173

121

1

200

2 3

3

00

3092

205

10

3

151

1

020

2 3

3

01712

0

180

180

44

Double Rotation (Step #1)

2092

155

10

30173

121

1

200

2 3

3

00

180

1792

155

10

203

121 200

2 3

3

10

300

180

45

Double Rotation (Step #2)

1792

155

10

203

121 200

2 3

3

10

300

180

2092

175

10

303

151

0

110

2 2

3

0012

018

46

Implementation

balance (1,0,-1)

key

rightleft

47

Single Rotation

RotateFromRight(n : reference node pointer) {p : node pointer;p := n.right;n.right := p.left;p.left := n;n := p

}

X

Y Z

n

RotateFromLeft is symmetric

48

Double Rotation

• Class participation• Implement Double Rotation in two lines.

DoubleRotateFromRight(n : reference node pointer) {????}

X

n

V W

Z

49

AVL Tree Deletion

• Similar to insertion– Rotations and double rotations needed to

rebalance– Imbalance may propagate upward so that

many rotations may be needed.

50

Arguments for AVL trees:

1. Search is O(log N) since AVL trees are always well balanced.2. The height balancing adds no more than a constant factor to the

speed of insertion, deletion, and find.

Arguments against using AVL trees:1. Difficult to program & debug; more space for height info.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).4. May be OK to have O(N) for a single operation if total run time for

many consecutive operations is fast (e.g. Splay trees).

Pros and Cons of AVL Trees

51

Double Rotation Solution

DoubleRotateFromRight(n : reference node pointer) {RotateFromLeft(n.right);RotateFromRight(n);}

X

n

V W

Z