Presentation is loading. Please wait.

Presentation is loading. Please wait.

Data Structures Lecture 22 Sohail Aslam.

Similar presentations


Presentation on theme: "Data Structures Lecture 22 Sohail Aslam."— Presentation transcript:

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.


Download ppt "Data Structures Lecture 22 Sohail Aslam."

Similar presentations


Ads by Google