# AVL trees

Télécharger la présentation

## AVL trees

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
##### Presentation Transcript

1. AVL trees

2. Today • AVL delete and subsequent rotations • Testing your knowledge with interactive demos!

3. AVL tree • Is a binary search tree • Has an additional height constraint: • For each node x in the tree, Height(x.left) differs from Height(x.right) by at most 1 • I promise: • If you satisfy the height constraint, then the height of the tree is O(lg n). • (Proof is easy, but no time! =])

4. AVL tree • To be an AVL tree, must always: • (1) Be a binary search tree • (2) Satisfy the height constraint • Suppose we start with an AVL tree, then delete as if we’re in a regular BST. • Will the tree be an AVL tree after the delete? • (1) It will still be a BST… • (2) Will it satisfy the height constraint? • (Not covering insert, since you already did in class)

5. BST Delete breaks an AVL tree 7 7 Delete(9) 9 4 4 3 3 h(left) > h(right)+1 so NOT an AVL tree!

6. Replacing the height constraint with balance factors • Instead of thinking about the heights of nodes, it is helpful to think in terms of balance factors • The balance factor bf(x) = h(x.right) – h(x.left) • bf(x) values -1, 0, and 1 are allowed • If bf(x) < -1 or bf(x) > 1 then tree is NOT AVL

7. Same example with bf(x), not h(x) 7 7 -2 -1 Delete(9) 9 4 4 -1 -1 0 3 3 0 0 bf < -1 soNOT an AVL tree!

8. What else can BST Delete break? • Balance factors of ancestors… 7 7 0 -1 -1 Delete(3) 9 9 4 4 0 -1 -1 0 0 3 0

9. Need a new Delete algorithm • Goal: if tree is AVL before Delete, then tree is AVL after Delete. • Step 1: do BST delete. • This maintains the BST property, but cancause the balance factors of ancestorsto be outdated! • Step 2: fix the height constraint and update balance factors. • Update any invalid balance factors affected by delete. • After updating them, they can be < -1 or > 1. • Do rotations to fix any balance factors that are too small or large while maintaining the BST property. • Rotations can cause balance factors to be outdated also!

10. Bad balance factors • Start with an AVL tree, then do a BST Delete. • What bad values can bf(x) take on? • Delete can reduce a subtree’s height by 1. • So, it might increase or decrease h(x.right) – h(x.left) by 1. • So, bf(x) might increase or decrease by 1. • This means: • if bf(x) = 1 before Delete, it might become 2. BAD. • If bf(x) = -1 before Delete, it might become -2. BAD. • If bf(x) = 0 before Delete, then it is still -1, 0 or 1. OK. 2 cases

11. Problematic cases for Delete(a) • bf(x) = -2 is just symmetric to bf(x) = 2. • So, we just look at bf(x) = 2. x x -2 2 h h+2 a a (deleted)

12. Delete(a): 3 subcases for bf(x)=2 • Since tree was AVL before, bf(z) = -1, 0 or 1 Case bf(z) = -1 Case bf(z) = 0 Case bf(z) = 1 x x x 2 2 2 z z z T1 T1 T1 -1 0 1 h a a a T2 T3 T2 T2 T3 T3 h h+1 h+1

13. Fixing case bf(x) = 2, bf(z) = 0 • We do a single left rotation • Preserves the BST property, and fixes bf(x) = 2 x z 2 -1 z x T3 T1 0 1 h T2 T2 T3 T1 h+1

14. Fixing case bf(x) = 2, bf(z) = 1 • We do a single left rotation (same as last case) • Preserves the BST property, and fixes bf(x) = 2 x z 2 0 z x T3 T1 1 0 h T2 T2 T3 T1 h h+1

15. Delete(a): bf(x)=2, bf(z)=-1 subcases Case bf(z) = -1: we have 3 subcases. (More details) Case bf(y) = 0 Case bf(y) = -1 Case bf(y) = 1 x x 2 2 x 2 z z T1 T1 -1 -1 z T1 -1 h y y y a T3 T3 0 a a -1 1 T3 h T21 T22 T21 T22 T21 T22 h-1 h

16. Double right-left rotation • All three subcases of bf(x)=2, bf(z)=-1 simply perform a double right-left rotation. x x y z y z x y z

17. Delete subcases for bf(x)=2, bf(z)=-1 • Case bf(y)=0: double right-left rotation! x y 2 0 z z x T1 0 -1 0 h T22 T1 T21 y T3 T3 0 h T21 T22 h

18. Delete subcases for bf(x)=2, bf(z)=-1 • Case bf(y)=-1: double right-left rotation! x y 2 0 z z x T1 1 -1 0 h T22 T1 T21 y T3 T3 -1 h T21 T22 h-1 h

19. Delete subcases for bf(x)=2, bf(z)=-1 • Case bf(y)=1: double right-left rotation! x y 2 0 z z x T1 0 -1 -1 h T22 T1 T21 y T3 T3 1 h T22 T21 h-1 h

20. Recursively fixing balance factors • Idea: start at the node we deleted, fix a problem, then recurse up the tree to the root. • At each node x, we update the balance factor: bf(x) := h(bf.right) - h(bf.left). • If bf(x) = -2 or +2, we perform a rotation. • Then, we update the balance factors of every node that was changed by the rotation. • Finally, we recurse one node higher up.

21. Interactive AVL Deletes • Interactive web applet