
AVL Trees: Deletion and Rotations Explained
Explore the concept of AVL trees, a type of balanced binary search tree that maintains a height constraint. Learn about the impact of deletions on AVL trees, the importance of balance factors, and how to ensure the tree remains AVL-compliant post-deletion through rotations and updates.
Download Presentation

Please find below an Image/Link to download the presentation.
The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.
You are allowed to download the files provided on this website for personal or commercial use, subject to the condition that they are used lawfully. All files are the property of their respective owners.
The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.
E N D
Presentation Transcript
Today AVL delete and subsequent rotations Testing your knowledge with interactive demos!
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! =])
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)
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!
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
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 so NOT an AVL tree!
What else can BST Delete break? 7 7 0 -1 -1 Delete(3) 9 0 9 4 4 -1 -1 0 0 3 0 Balance factors of ancestors
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 can cause the balance factors of ancestors to 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!
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
Problematic cases for Delete(a) x x -2 2 h h+2 a a (deleted) bf(x) = -2 is just symmetric to bf(x) = 2. So, we just look at bf(x) = 2.
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 -1 0 1 h T1 T1 T1 a a a h T3 T2 h+1 h+1 T2 T2 T3 T3
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 0 1 h T1 T3 h+1 T1 T2 T2 T3
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 1 0 h T1 T3 h T2 T2 h+1 T1 T3
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 x 2 2 2 z -1 z z -1 -1 h T1 T1 T1 y a 0 y y a a -1 1 h T3 T3 T3 h-1 h T22 T21 T21 T22 T21 T22
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
Delete subcases for bf(x)=2, bf(z)=-1 Case bf(y)=0: double right-left rotation! x y 2 0 z z x 0 -1 0 h T1 y 0 h T1 T22 T3 T21 T3 h T21 T22
Delete subcases for bf(x)=2, bf(z)=-1 Case bf(y)=-1: double right-left rotation! x y 2 0 z z x 1 -1 0 h T1 y -1 T22 h T1 T3 T21 T3 h-1 T22 h T21
Delete subcases for bf(x)=2, bf(z)=-1 Case bf(y)=1: double right-left rotation! x y 2 0 z z x 0 -1 -1 h T1 y 1 T21 h T1 T22 T3 T3 h-1 T21 h T22
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.
Interactive AVL Deletes Interactive web applet