平衡二叉树的实现c语言
时间: 2024-03-01 17:46:46 浏览: 24
平衡二叉树的实现可以使用C语言来完成。下面是一个简单的平衡二叉树的实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
struct Node {
int data;
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 data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
newNode->height = 1;
return newNode;
}
// 右旋操作
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 data) {
// 执行标准的BST插入
if (node == NULL) {
return createNode(data);
}
if (data < node->data) {
node->left = insertNode(node->left, data);
} else if (data > node->data) {
node->right = insertNode(node->right, data);
} else {
return node; // 如果节点已经存在,则直接返回
}
// 更新节点的高度
node->height = 1 + max(getHeight(node->left), getHeight(node->right));
// 获取节点的平衡因子
int balanceFactor = getBalanceFactor(node);
// 如果节点不平衡,根据平衡因子进行旋转操作
// 左左情况
if (balanceFactor > 1 && data < node->left->data) {
return rightRotate(node);
}
// 右右情况
if (balanceFactor < -1 && data > node->right->data) {
return leftRotate(node);
}
// 左右情况
if (balanceFactor > 1 && data > node->left->data) {
node->left = leftRotate(node->left);
return rightRotate(node);
}
// 右左情况
if (balanceFactor < -1 && data < node->right->data) {
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
// 中序遍历二叉树
void inorderTraversal(struct Node* root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("%d ", root->data);
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);
// 中序遍历二叉树
printf("Inorder traversal of the AVL tree: ");
inorderTraversal(root);
printf("\n");
return 0;
}
```
这个示例代码实现了一个简单的平衡二叉树,包括节点的插入操作和中序遍历操作。你可以根据需要进行修改和扩展。