树的旋转操作通常用于保持树的平衡,例如在AVL树中。以下是几种常见旋转操作的实现方法:
左旋转(Left Rotation)
左旋转是将一个节点的右子树变为其左子树,并调整相关节点的高度。以下是一个简单的C语言实现:
```c
include
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
int height;
} Node;
// 获取节点的高度
int height(Node* N) {
if (N == NULL)
return 0;
return N->height;
}
// 右旋转
Node* rightRotate(Node* y) {
Node* x = y->left;
Node* T2 = x->right;
// 执行旋转
x->right = y;
y->left = T2;
// 更新高度
y->height = 1 + height(y->left);
x->height = 1 + height(x->right);
return x;
}
// 左旋转
Node* leftRotate(Node* x) {
Node* y = x->right;
Node* T2 = y->left;
// 执行旋转
y->left = x;
x->right = T2;
// 更新高度
x->height = 1 + height(x->left);
y->height = 1 + height(y->right);
return y;
}
// 获取平衡因子
int getBalance(Node* N) {
if (N == NULL)
return 0;
return height(N->left) - height(N->right);
}
// 插入节点并平衡树
Node* insert(Node* node, int key) {
// 1. 执行标准二叉搜索树插入
if (node == NULL)
return (new Node(key));
if (key < node->data)
node->left = insert(node->left, key);
else if (key > node->data)
node->right = insert(node->right, key);
else // 不允许插入重复值
return node;
// 2. 更新节点高度
node->height = 1 + height(node->left);
// 3. 获取平衡因子
int balance = getBalance(node);
// 4. 如果节点不平衡,则进行旋转
// 左左情况
if (balance > 1 && key < node->left->data)
return rightRotate(node);
// 右右情况
if (balance < -1 && key > node->right->data)
return leftRotate(node);
// 左右情况
if (balance > 1 && key > node->left->data) {
node->left = leftRotate(node->left);
return rightRotate(node);
}
// 右左情况
if (balance < -1 && key < node->right->data) {
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
// 中序遍历
void inorder(Node* node) {
if (node != NULL) {
inorder(node->left);
printf("%d ", node->data);
inorder(node->right);
}
}
int main() {
Node* root = NULL;
root = insert(root, 10);
root = insert(root, 20);
root = insert(root, 30);
root = insert(root, 40);
root = insert(root, 50);
root = insert(root, 25);
printf("Inorder traversal of the constructed tree is \n");
inorder(root);
return 0;
}
```
右旋转(Right Rotation)
右旋转与左旋转类似,只是将节点的左子树变为其右子树,并调整相关节点的高度。以下是一个简单的C语言实现: