Télécharger la présentation
## AVL Trees

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -

**CSE 373**Data Structures Lecture 8 AVL Trees**AVL Trees - Lecture 8**Readings • Reading • Section 4.4,**AVL Trees - Lecture 8**Binary Search Tree - Best Time • All BST operations are O(d), where d is tree depth • minimum d is for a binary tree with N nodes • What is the best case tree? • What is the worst case tree? • So, best case running time of BST operations is O(log N)**AVL Trees - Lecture 8**Binary Search Tree - Worst Time • Worst case running time is O(N) • What happens when you Insert elements in ascending order? • Insert: 2, 4, 6, 8, 10, 12 into an empty BST • Problem: Lack of “balance”: • compare depths of left and right subtree • Unbalanced degenerate tree**AVL Trees - Lecture 8**Balanced and unbalanced BST 1 4 2 2 5 3 1 3 4 4 Is this “balanced”? 5 2 6 6 1 3 5 7 7**AVL Trees - Lecture 8**Approaches to balancing trees • Don't balance • May end up with some nodes very deep • Strict balance • The tree must always be balanced perfectly • Pretty good balance • Only allow a little out of balance • Adjust on access • Self-adjusting**AVL Trees - Lecture 8**Balancing Binary Search Trees • Many algorithms exist for keeping binary search trees balanced • Adelson-Velskii and Landis (AVL) trees (height-balanced trees) • Splay trees and other self-adjusting trees • B-trees and other multiway search trees**AVL Trees - Lecture 8**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 Insert 2 & complete tree 4 9 2 8 1 5 8 1 4 6 9**AVL Trees - Lecture 8**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 - Lecture 8**Height of an AVL Tree • N(h) = minimum number of nodes in an AVL tree of height h. • Basis • N(0) = 1, N(1) = 2 • Induction • N(h) = N(h-1) + N(h-2) + 1 • Solution(recall Fibonacci analysis) • N(h) >h ( 1.62) h h-2 h-1**AVL Trees - Lecture 8**Height of an AVL Tree • N(h) >h ( 1.62) • Suppose we have n nodes in an AVL tree of height h. • n > N(h) (because N(h) was the minimum) • n >h hence log n > h (relatively well balanced tree!!) • h < 1.44 log2n (i.e., Find takes O(logn))**AVL Trees - Lecture 8**Node Heights Tree A (AVL) Tree B (AVL) height=2 BF=1-0=1 2 6 6 1 0 1 1 4 9 4 9 0 0 0 0 0 1 5 1 5 8 height of node = h balance factor = hleft-hright empty height = -1**AVL Trees - Lecture 8**Node Heights after Insert 7 Tree A (AVL) Tree B (not AVL) balance factor 1-(-1) = 2 2 3 6 6 1 1 1 2 4 9 4 9 -1 0 0 0 0 0 1 7 1 5 1 5 8 0 7 height of node = h balance factor = hleft-hright empty height = -1**AVL Trees - Lecture 8**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 hleft-hright) is 2 or –2, adjust tree by rotationaround the node**AVL Trees - Lecture 8**Single Rotation in an AVL Tree 2 2 6 6 1 2 1 1 4 9 4 8 0 0 0 0 1 0 0 7 9 1 5 8 1 5 0 7**AVL Trees - Lecture 8**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 - Lecture 8**AVL Insertion: Outside Case j Consider a valid AVL subtree k h Z h h X Y**AVL Trees - Lecture 8**AVL Insertion: Outside Case j Inserting into X destroys the AVL property at node j k h Z h+1 h Y X**AVL Trees - Lecture 8**AVL Insertion: Outside Case j Do a “right rotation” k h Z h+1 h Y X**AVL Trees - Lecture 8**Single right rotation j Do a “right rotation” k h Z h+1 h Y X**AVL Trees - Lecture 8**Outside Case Completed “Right rotation” done! (“Left rotation” is mirror symmetric) k j h+1 h h X Z Y AVL property has been restored!**AVL Trees - Lecture 8**AVL Insertion: Inside Case j Consider a valid AVL subtree k h Z h h X Y**AVL Trees - Lecture 8**AVL Insertion: Inside Case j Inserting into Y destroys the AVL property at node j Does “right rotation” restore balance? k h Z h h+1 X Y**AVL Trees - Lecture 8**AVL Insertion: Inside Case k “Right rotation” does not restore balance… now k is out of balance j h X h h+1 Z Y**AVL Trees - Lecture 8**AVL Insertion: Inside Case j Consider the structure of subtree Y… k h Z h h+1 X Y**AVL Trees - Lecture 8**AVL Insertion: Inside Case j Y = node i and subtrees V and W k h Z i h h+1 X h or h-1 W V**AVL Trees - Lecture 8**AVL Insertion: Inside Case j We will do a left-right “double rotation” . . . k Z i X W V**AVL Trees - Lecture 8**Double rotation : first rotation j left rotation complete i Z k W V X**AVL Trees - Lecture 8**Double rotation : second rotation j Now do a right rotation i Z k W V X**AVL Trees - Lecture 8**Double rotation : second rotation right rotation complete Balance has been restored i j k h h h or h-1 V Z W X**AVL Trees - Lecture 8**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 don’t perform rotations Once you have performed a rotation (single or double) you won’t need to go back up the tree**AVL Trees - Lecture 8**Single Rotation RotateFromRight(n : reference node pointer) { p : node pointer; p := n.right; n.right := p.left; p.left := n; n := p } n X You also need to modify the heights or balance factors of n and p Insert Y Z**AVL Trees - Lecture 8**Double Rotation • Implement Double Rotation in two lines. DoubleRotateFromRight(n : reference node pointer) { ???? } n X Z V W**AVL Trees - Lecture 8**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 hleft-hright) is 2 or –2, adjust tree by rotation around the node**AVL Trees - Lecture 8**Insert in BST Insert(T : reference tree pointer, x : element) : integer { if T = null then T := new tree; T.data := x; return 1;//the links to //children are null case T.data = x : return 0; //Duplicate do nothing T.data > x : return Insert(T.left, x); T.data < x : return Insert(T.right, x); endcase }**AVL Trees - Lecture 8**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 - Lecture 8**Example of Insertions in an AVL Tree 2 20 Insert 5, 40 0 1 10 30 0 0 35 25**AVL Trees - Lecture 8**Example of Insertions in an AVL Tree 2 3 20 20 1 1 1 2 10 30 10 30 0 0 0 1 0 0 5 35 5 35 25 25 0 40 Now Insert 45**AVL Trees - Lecture 8**Single rotation (outside case) 3 3 20 20 1 2 1 2 10 30 10 30 0 2 0 0 0 1 5 35 5 40 25 25 0 0 35 45 40 1 Imbalance 0 45 Now Insert 34**AVL Trees - Lecture 8**Double rotation (inside case) 3 3 20 20 1 3 1 2 10 30 10 35 0 2 0 0 1 1 5 Imbalance 40 5 40 25 30 0 25 34 1 0 45 35 45 0 Insertion of 34 0 34**AVL Trees - Lecture 8**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 - Lecture 8**Pros and Cons of AVL Trees Arguments for AVL trees: • Search is O(log N) since AVL trees are always balanced. • Insertion and deletions are also O(logn) • The height balancing adds no more than a constant factor to the speed of insertion. Arguments against using AVL trees: • Difficult to program & debug; more space for balance factor. • Asymptotically faster but rebalancing costs time. • Most large searches are done in database systems on disk and use other structures (e.g. B-trees). • 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).**AVL Trees - Lecture 8**Double Rotation Solution DoubleRotateFromRight(n : reference node pointer) { RotateFromLeft(n.right); RotateFromRight(n); } n X Z V W