Download presentation
Presentation is loading. Please wait.
1
Data Structures Lecture 22 Sohail Aslam
2
Cases for Rotation Single right rotation fails to fix case 2. k2
Z Level n-2 X Y Y Z Level n-1 new new Level n
3
Cases for Rotation Y is non-empty because the new node was inserted in Y. Thus Y has a root and two subtrees. View the entire tree with four subtrees connected with 3 nodes. k2 k1 Z Y X End of lecture 21. Start of 22
4
Cases for Rotation Y is non-empty because the new node was inserted in Y. Thus Y has a root and two subtrees. View the entire tree with four subtrees connected with 3 nodes. k1 k3 D A B C k2
5
Cases for Rotation Exactly one of tree B or C is two levels deeper than D; we are not sure which one. Good thing: it does not matter. To rebalance, k3 cannot be left as the root. k3 k1 D k2 A 1 B C new 2 new’ New node inserted a either of the two spots
6
Cases for Rotation A rotation between k3 and k1 (k3 was k2 then) was shown to not work. The only alternative is to place k2 as the new root. This forces k1 to be k2‘s left child and k3 to be its right child. k3 k1 D k2 A 1 B C new 2 new’ New node inserted a either of the two spots
7
Cases for Rotation Left-right double rotation to fix case 2. k3 k2 k1
new B D C new’ k3 k2 k1 k3 Rotate left k1 D k2 A 1 B C new 2 New node inserted a either of the two spots new’
8
Cases for Rotation Left-right double rotation to fix case 2. k3 k2
Rotate right k2 k1 k3 D k1 A D C new’ B C A new B new new’
9
Cases for Rotation Right-left double rotation to fix case 3. k1 k1 k3
Rotate right k1 k3 k2 A A k2 k3 D B B C C D
10
Cases for Rotation Right-left double rotation to fix case 3. k1 k2 k2
Rotate left k2 k2 k1 k3 A B C k3 B A D C D
11
AVL Tree Building Example
Insert(15) 4 2 6 1 3 5 7 k1 16 k2 X (null) Y Z (null) 15
12
AVL Tree Building Example
Insert(15) right-left double rotation 4 2 6 k1 1 3 5 7 k3 16 k2 Rotate right 15
13
AVL Tree Building Example
Insert(15) right-left double rotation 4 2 6 k1 1 3 5 7 k2 Rotate left 15 k3 16
14
AVL Tree Building Example
Insert(15) right-left double rotation 4 2 6 15 k2 1 3 5 7 k1 16 k3
15
AVL Tree Building Example
Insert(14): right-left double rotation 4 k1 2 6 k3 1 3 5 15 k2 Rotate right 7 16 14
16
AVL Tree Building Example
Insert(14): right-left double rotation 4 k1 2 6 Rotate left k2 1 3 5 7 k3 15 14 16
17
AVL Tree Building Example
Insert(14): right-left double rotation 4 k2 7 2 6 k1 k3 15 1 3 5 14 16
18
AVL Tree Building Example
Insert(13): single rotation 4 Rotate left 2 7 1 3 6 15 5 14 16 13
19
AVL Tree Building Example
Insert(13): single rotation 1 2 3 4 5 16 15 7 6 14 13
20
C++ code for insert TreeNode<int>*
avlInsert(TreeNode<int>* root, int info) { if( info < root->getInfo() ){ root->se tLeft(avlInsert(root->getLeft(), info)); int htdiff = height(root->getLeft()) – height(root->getRight()); if( htdiff == 2 ) if( info < root->getLeft()->getInfo() ) root = singleRightRotation( root ); else root = doubleLeftRightRotation( root ); }
21
C++ code for insert TreeNode<int>*
avlInsert(TreeNode<int>* root, int info) { if( info < root->getInfo() ){ root->setLeft(avlInsert(root->getLeft(), info)); int htdiff = height(root->getLeft()) – height(root->getRight()); if( htdiff == 2 ) if( info < root->getLeft()->getInfo() ) root = singleRightRotation( root ); else root = doubleLeftRightRotation( root ); }
22
C++ code for insert TreeNode<int>*
avlInsert(TreeNode<int>* root, int info) { if( info < root->getInfo() ){ root->setLeft(avlInsert(root->getLeft(), info)); int htdiff = height(root->getLeft()) – height(root->getRight()); if( htdiff == 2 ) if( info < root->getLeft()->getInfo() ) root = singleRightRotation( root ); else root = doubleLeftRightRotation( root ); } Root of left subtree may change
23
C++ code for insert TreeNode<int>*
avlInsert(TreeNode<int>* root, int info) { if( info < root->getInfo() ){ root->setLeft(avlInsert(root->getLeft(), info)); int htdiff = height(root->getLeft()) – height(root->getRight()); if( htdiff == 2 ) if( info < root->getLeft()->getInfo() ) root = singleRightRotation( root ); else root = doubleLeftRightRotation( root ); }
24
C++ code for insert TreeNode<int>*
avlInsert(TreeNode<int>* root, int info) { if( info < root->getInfo() ){ root->setLeft(avlInsert(root->getLeft(), info)); int htdiff = height(root->getLeft()) – height(root->getRight()); if( htdiff == 2 ) if( info < root->getLeft()->getInfo() ) root = singleRightRotation( root ); else root = doubleLeftRightRotation( root ); }
25
C++ code for insert TreeNode<int>*
avlInsert(TreeNode<int>* root, int info) { if( info < root->getInfo() ){ root->setLeft(avlInsert(root->getLeft(), info)); int htdiff = height(root->getLeft()) – height(root->getRight()); if( htdiff == 2 ) if( info < root->getLeft()->getInfo() ) root = singleRightRotation( root ); else root = doubleLeftRightRotation( root ); } Outside case inside case
26
C++ code for insert else if(info > root->getInfo() ) {
root->setRight(avlInsert(root->getRight(),info)); int htdiff = height(root->getRight()) – height(root->getLeft()); if( htdiff == 2 ) if( info > root->getRight()->getInfo() ) root = singleLeftRotation( root ); else root = doubleRightLeftRotation( root ); } // else a node with info is already in the tree. In // case, reset the height of this root node. int ht = Max(height(root->getLeft()), height(root->getRight())); root->setHeight( ht+1 ); // new height for root. return root;
27
C++ code for insert else if(info > root->getInfo() ) {
root->setRight(avlInsert(root->getRight(),info)); int htdiff = height(root->getRight()) – height(root->getLeft()); if( htdiff == 2 ) if( info > root->getRight()->getInfo() ) root = singleLeftRotation( root ); else root = doubleRightLeftRotation( root ); } // else a node with info is already in the tree. In // case, reset the height of this root node. int ht = Max(height(root->getLeft()), height(root->getRight())); root->setHeight( ht+1 ); // new height for root. return root;
28
C++ code for insert else if(info > root->getInfo() ) {
root->setRight(avlInsert(root->getRight(),info)); int htdiff = height(root->getRight()) – height(root->getLeft()); if( htdiff == 2 ) if( info > root->getRight()->getInfo() ) root = singleLeftRotation( root ); else root = doubleRightLeftRotation( root ); } // else a node with info is already in the tree. In // case, reset the height of this root node. int ht = Max(height(root->getLeft()), height(root->getRight())); root->setHeight( ht+1 ); // new height for root. return root;
29
C++ code for insert else if(info > root->getInfo() ) {
root->setRight(avlInsert(root->getRight(),info)); int htdiff = height(root->getRight()) – height(root->getLeft()); if( htdiff == 2 ) if( info > root->getRight()->getInfo() ) root = singleLeftRotation( root ); else root = doubleRightLeftRotation( root ); } // else a node with info is already in the tree. In // case, reset the height of this root node. int ht = Max(height(root->getLeft()), height(root->getRight())); root->setHeight( ht+1 ); // new height for root. return root;
30
C++ code for insert else if(info > root->getInfo() ) {
root->setRight(avlInsert(root->getRight(),info)); int htdiff = height(root->getRight()) – height(root->getLeft()); if( htdiff == 2 ) if( info > root->getRight()->getInfo() ) root = singleLeftRotation( root ); else root = doubleRightLeftRotation( root ); } // else a node with info is already in the tree. In // case, reset the height of this root node. int ht = Max(height(root->getLeft()), height(root->getRight())); root->setHeight( ht+1 ); // new height for root. return root;
31
C++ code for insert else if(info > root->getInfo() ) {
root->setRight(avlInsert(root->getRight(),info)); int htdiff = height(root->getRight()) – height(root->getLeft()); if( htdiff == 2 ) if( info > root->getRight()->getInfo() ) root = singleLeftRotation( root ); else root = doubleRightLeftRotation( root ); } // else a node with info is already in the tree. In // case, reset the height of this root node. int ht = Max(height(root->getLeft()), height(root->getRight())); root->setHeight( ht+1 ); // new height for root. return root;
32
C++ code for insert else if(info > root->getInfo() ) {
root->setRight(avlInsert(root->getRight(),info)); int htdiff = height(root->getRight()) – height(root->getLeft()); if( htdiff == 2 ) if( info > root->getRight()->getInfo() ) root = singleLeftRotation( root ); else root = doubleRightLeftRotation( root ); } // else a node with info is already in the tree. In // case, reset the height of this root node. int ht = Max(height(root->getLeft()), height(root->getRight())); root->setHeight( ht+1 ); // new height for root. return root; End of lecture 22.
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.