AVL树的结构体,插入,删除和查找的代码,c语言
时间: 2023-06-27 14:06:57 浏览: 54
以下是AVL树的结构体,插入,删除和查找的代码,使用C语言实现:
```c
// AVL树结点结构体
typedef struct AVLNode {
int key; // 关键字
int height; // 高度
struct AVLNode *left; // 左子树指针
struct AVLNode *right; // 右子树指针
} AVLNode;
// 插入结点
AVLNode* insertNode(AVLNode* root, int key) {
// 如果根结点为空,创建一个结点
if (root == NULL) {
AVLNode* newNode = (AVLNode*)malloc(sizeof(AVLNode));
newNode->key = key;
newNode->height = 1;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 如果新插入的值小于根结点的值,则插入到左子树中
if (key < root->key) {
root->left = insertNode(root->left, key);
}
// 如果新插入的值大于根结点的值,则插入到右子树中
else {
root->right = insertNode(root->right, key);
}
// 更新结点的高度
root->height = max(getHeight(root->left), getHeight(root->right)) + 1;
// 判断是否需要进行旋转操作
int balanceFactor = getBalanceFactor(root);
if (balanceFactor > 1 && key < root->left->key) {
// 左-左情况
return rightRotate(root);
}
if (balanceFactor > 1 && key > root->left->key) {
// 左-右情况
root->left = leftRotate(root->left);
return rightRotate(root);
}
if (balanceFactor < -1 && key > root->right->key) {
// 右-右情况
return leftRotate(root);
}
if (balanceFactor < -1 && key < root->right->key) {
// 右-左情况
root->right = rightRotate(root->right);
return leftRotate(root);
}
// 如果不需要旋转,则直接返回根结点
return root;
}
// 删除结点
AVLNode* deleteNode(AVLNode* root, int key) {
// 如果根结点为空,返回NULL
if (root == NULL) {
return NULL;
}
// 如果要删除的值小于根结点的值,则删除左子树中的结点
if (key < root->key) {
root->left = deleteNode(root->left, key);
}
// 如果要删除的值大于根结点的值,则删除右子树中的结点
else if (key > root->key) {
root->right = deleteNode(root->right, key);
}
// 如果要删除的值等于根结点的值,则删除当前结点
else {
// 如果当前结点只有一个子树或者没有子树,则直接删除
if (root->left == NULL || root->right == NULL) {
AVLNode* temp = root->left ? root->left : root->right;
// 如果当前结点没有子树,则直接释放当前结点
if (temp == NULL) {
temp = root;
root = NULL;
}
// 如果当前结点只有一个子树,则将该子树连接到当前结点的父结点上
else {
*root = *temp;
}
free(temp);
}
// 如果当前结点有两个子树,则找到当前结点的后继结点,并将其值复制到当前结点中,然后删除后继结点
else {
AVLNode* temp = findMin(root->right);
root->key = temp->key;
root->right = deleteNode(root->right, temp->key);
}
}
// 如果树为空,则直接返回
if (root == NULL) {
return NULL;
}
// 更新结点的高度
root->height = max(getHeight(root->left), getHeight(root->right)) + 1;
// 判断是否需要进行旋转操作
int balanceFactor = getBalanceFactor(root);
if (balanceFactor > 1 && getBalanceFactor(root->left) >= 0) {
// 左-左情况
return rightRotate(root);
}
if (balanceFactor > 1 && getBalanceFactor(root->left) < 0) {
// 左-右情况
root->left = leftRotate(root->left);
return rightRotate(root);
}
if (balanceFactor < -1 && getBalanceFactor(root->right) <= 0) {
// 右-右情况
return leftRotate(root);
}
if (balanceFactor < -1 && getBalanceFactor(root->right) > 0) {
// 右-左情况
root->right = rightRotate(root->right);
return leftRotate(root);
}
// 如果不需要旋转,则直接返回根结点
return root;
}
// 查找结点
AVLNode* searchNode(AVLNode* root, int key) {
// 如果根结点为空,返回NULL
if (root == NULL) {
return NULL;
}
// 如果要查找的值小于根结点的值,则在左子树中查找
if (key < root->key) {
return searchNode(root->left, key);
}
// 如果要查找的值大于根结点的值,则在右子树中查找
else if (key > root->key) {
return searchNode(root->right, key);
}
// 如果要查找的值等于根结点的值,则返回当前结点
else {
return root;
}
}
```
其中,`getHeight`函数用于获取结点的高度,`getBalanceFactor`函数用于获取结点的平衡因子,`leftRotate`函数用于进行左旋操作,`rightRotate`函数用于进行右旋操作,`findMin`函数用于查找当前结点的右子树中的最小值结点。