是一种自平衡的二叉搜索树,它通过在插入操作时进行旋转和调整来保持树的平衡。AVL树的名称来自于其发明者Adelson-Velsky和Landis。
AVL树的主要特点是每个节点都有一个平衡因子,即左子树的高度减去右子树的高度。平衡因子可以是-1、0或1,当平衡因子超过这个范围时,就需要进行旋转和调整来恢复树的平衡。
迭代插入是指在插入新节点时使用循环而不是递归的方式。以下是一个带有迭代插入的C语言AVL树的示例代码:
#include <stdio.h>
#include <stdlib.h>
// AVL树节点结构
struct Node {
int key;
struct Node* left;
struct Node* right;
int height;
};
// 获取节点的高度
int getHeight(struct Node* node) {
if (node == NULL)
return 0;
return node->height;
}
// 获取两个数中较大的数
int max(int a, int b) {
return (a > b) ? a : b;
}
// 创建一个新节点
struct Node* createNode(int key) {
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
node->key = key;
node->left = NULL;
node->right = NULL;
node->height = 1;
return node;
}
// 右旋操作
struct Node* rightRotate(struct Node* y) {
struct Node* x = y->left;
struct Node* T2 = x->right;
x->right = y;
y->left = T2;
y->height = max(getHeight(y->left), getHeight(y->right)) + 1;
x->height = max(getHeight(x->left), getHeight(x->right)) + 1;
return x;
}
// 左旋操作
struct Node* leftRotate(struct Node* x) {
struct Node* y = x->right;
struct Node* T2 = y->left;
y->left = x;
x->right = T2;
x->height = max(getHeight(x->left), getHeight(x->right)) + 1;
y->height = max(getHeight(y->left), getHeight(y->right)) + 1;
return y;
}
// 获取平衡因子
int getBalanceFactor(struct Node* node) {
if (node == NULL)
return 0;
return getHeight(node->left) - getHeight(node->right);
}
// 插入节点
struct Node* insertNode(struct Node* node, int key) {
// 执行标准的BST插入
if (node == NULL)
return createNode(key);
if (key < node->key)
node->left = insertNode(node->left, key);
else if (key > node->key)
node->right = insertNode(node->right, key);
else
return node; // 不允许插入重复的节点
// 更新节点的高度
node->height = 1 + max(getHeight(node->left), getHeight(node->right));
// 获取节点的平衡因子
int balanceFactor = getBalanceFactor(node);
// 如果节点不平衡,根据平衡因子进行旋转和调整
if (balanceFactor > 1) {
if (key < node->left->key) {
// 左左情况,进行右旋
return rightRotate(node);
} else if (key > node->left->key) {
// 左右情况,先左旋再右旋
node->left = leftRotate(node->left);
return rightRotate(node);
}
}
if (balanceFactor < -1) {
if (key > node->right->key) {
// 右右情况,进行左旋
return leftRotate(node);
} else if (key < node->right->key) {
// 右左情况,先右旋再左旋
node->right = rightRotate(node->right);
return leftRotate(node);
}
}
return node;
}
// 中序遍历AVL树
void inorderTraversal(struct Node* root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("%d ", root->key);
inorderTraversal(root->right);
}
}
// 主函数
int main() {
struct Node* root = NULL;
// 插入节点
root = insertNode(root, 10);
root = insertNode(root, 20);
root = insertNode(root, 30);
root = insertNode(root, 40);
root = insertNode(root, 50);
root = insertNode(root, 25);
// 中序遍历AVL树
printf("AVL树中序遍历结果:");
inorderTraversal(root);
return 0;
}
这段代码实现了一个带有迭代插入的AVL树,它可以插入新节点并保持树的平衡。在主函数中,我们插入了一些节点并进行了中序遍历,以验证树的正确性。
AVL树的优势在于它可以在插入和删除节点时自动保持树的平衡,从而提供较快的搜索、插入和删除操作。它适用于需要频繁进行这些操作的场景,例如数据库索引、字典等。
腾讯云提供了多个与云计算相关的产品,其中包括云服务器、云数据库、云存储、人工智能等。具体推荐的腾讯云产品和产品介绍链接地址可以根据实际需求进行选择。
领取专属 10元无门槛券
手把手带您无忧上云