AVL树使用旋转操作来维持平衡。其中包括左旋、右旋、左右旋和右左旋四种操作。在这四种情况下,很多人会选择不同的方式来平衡树,但是实际上它们的本质都是一样的。
以左右旋为例,实现代码如下:
AVLNode *left_rotate(AVLNode *node) {
AVLNode *right = node->right;
node->right = right->left;
right->left = node;
node->height = max(get_height(node->left), get_height(node->right)) + 1;
right->height = max(get_height(right->left), get_height(right->right)) + 1;
return right;
}
AVLNode *right_rotate(AVLNode *node) {
AVLNode *left = node->left;
node->left = left->right;
left->right = node;
node->height = max(get_height(node->left), get_height(node->right)) + 1;
left->height = max(get_height(left->left), get_height(left->right)) + 1;
return left;
}
AVLNode *right_left_rotate(AVLNode *node) {
node->right = right_rotate(node->right);
return left_rotate(node);
}
AVLNode *left_right_rotate(AVLNode *node) {
node->left = left_rotate(node->left);
return right_rotate(node);
}
其中,perform_rotation()函数负责根据具体情况选择旋转方式:
AVLNode *perform_rotation(AVLNode *node) {
int balance_factor = get_balance_factor(node);
if (balance_factor > 1) {
if (get_balance_factor(node->left) < 0)
node = left_right_rotate(node);
else
node = right_rotate(node);
}
else if (balance_factor < -1) {
if (get_balance_factor(node->right) > 0)
node = right_left_rotate(node
下一篇:AVL树删除 C++