Вы не обновляете указатель left
или right
родительского элемента v
. Могут быть и другие проблемы. Вот код из моей рабочей реализации. Имена переменных разные, но вы можете сравнить их с вашими и посмотреть, какие операции вам не хватает. Функция update_height
, которая вызывается в конце, пересекает дерево, обновляя высоту каждого узла по мере его продвижения.
template<typename K, typename V>
void AVLTree<K,V>::right_rotate(AVLNode<K,V> *node)
{
auto hold = node->left;
if (node == root)
{
root = hold;
}
else if (node == node->parent->left)
{
node->parent->left = hold;
}
else
{
node->parent->right = hold;
}
hold->parent = node->parent;
node->left = node->left->right;
if (node->left)
{
node->left->parent = node;
}
hold->right = node;
node->parent = hold;
update_height(node);
}