void AVLTree<K, V>::rotateRight(Node * & t) { *_out << __func__ << endl; // Outputs the rotation name (don't remove this) // your code here Node *temp = t->left; t->left = temp->right; temp->right = t; t = temp; if(t->right != NULL) { t->right->height = 1+max( heightOrNeg1(t->right->left), heightOrNeg1(t->right->right) ); } if(t->left != NULL) { t->left->height = 1+max( heightOrNeg1(t->left->left), heightOrNeg1(t->left->right) ); } t->height = 1+max( heightOrNeg1(t->left), heightOrNeg1(t->right) ); }
void AVLTree<K, V>::insert(Node* & subtree, const K & key, const V & value) { if(subtree == NULL) { subtree = new Node(key, value); return; } if(subtree->key == key) return; if(key < subtree->key) { insert(subtree->left, key, value); } else { insert(subtree->right, key, value); } if(heightOrNeg1(subtree->right) - heightOrNeg1(subtree->left) == 2) { if(subtree->right != NULL) { if(heightOrNeg1(subtree->right->left) > heightOrNeg1(subtree->right->right)) { rotateRightLeft(subtree); } else if (heightOrNeg1(subtree->right->left) < heightOrNeg1(subtree->right->right)) { rotateLeft(subtree); } } } else if(heightOrNeg1(subtree->right) - heightOrNeg1(subtree->left) == -2) { if(subtree->left != NULL) { if(heightOrNeg1(subtree->left->right) > heightOrNeg1(subtree->left->left)) { rotateLeftRight(subtree); } else if(heightOrNeg1(subtree->left->right) < heightOrNeg1(subtree->left->left)) { rotateRight(subtree); } } } subtree->height = calculateSubtreeHeight(subtree); }
int AVLTree<K, V>::calculateSubtreeHeight(Node* & node) { return 1 + max(heightOrNeg1(node->left), heightOrNeg1(node->right)); }
void AVLTree<K, V>::insert(Node* & subtree, const K & key, const V & value) { // your code here // position found if(subtree == NULL) { subtree = new Node(key, value); return; } // duplicate key if(key == subtree->key) { return; } // insert left if(key < subtree->key) { // insert to the left recursively insert(subtree->left, key, value); // check balance int balance = heightOrNeg1(subtree->right) - heightOrNeg1(subtree->left); int left_balance = heightOrNeg1(subtree->left->right) - heightOrNeg1(subtree->left->left); if(balance == -2) { if(left_balance == -1) { rotateRight(subtree); } else { rotateLeftRight(subtree); } } subtree->height = 1+max( heightOrNeg1(subtree->left), heightOrNeg1(subtree->right) ); return; } // insert right if(key > subtree->key) { // insert to the right recursively insert(subtree->right, key, value); // check balance int balance = heightOrNeg1(subtree->right) - heightOrNeg1(subtree->left); int right_balance = heightOrNeg1(subtree->right->right) - heightOrNeg1(subtree->right->left); if(balance == 2) { if(right_balance == 1) { rotateLeft(subtree); } else { rotateRightLeft(subtree); } } subtree->height = 1+max( heightOrNeg1(subtree->left), heightOrNeg1(subtree->right) ); } }