平衡二叉树算法的c语言代码
时间: 2024-08-15 19:09:36 浏览: 51
平衡二叉树,如AVL树或红黑树,是一种特殊的二叉搜索树,它的左右两个子树的高度差不超过1。以下是使用C语言实现AVL树的基本插入操作的一个简单示例,它包含了旋转操作来保持平衡:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
int height; // 节点高度
} Node;
// 计算新插入节点的新高度
int computeHeight(Node* node) {
if (node == NULL)
return 0;
else
return node->height;
}
// 更新节点的平衡因子(左子树高度 - 右子树高度)
int getBalanceFactor(Node* node) {
if (node == NULL)
return 0;
else
return computeHeight(node- computeHeight(node->right);
}
// 左旋
Node* leftRotate(Node* y) {
Node* x = y->right;
Node* T2 = x->left;
// 将y的右子树替换为x
y->right = T2;
// 如果x有左孩子,则设置x的左孩子为新的y
if (T2 != NULL)
T2->parent = y;
// 设置x为新的根
x->parent = y->parent;
// 如果y是空子树的根,则将新的根设为x
if (y->parent == NULL) {
root = x;
}
// 否则,y的父亲成为新的祖父母
else if (y == y->parent->left) {
y->parent->left = x;
} else {
y->parent->right = x;
}
// 更新y和x的height
y->height = computeHeight(y);
x->height = computeHeight(x);
return x;
}
// 右旋
Node* rightRotate(Node* x) {
// 类似于leftRotate,只是方向相反
// ...
}
// 插入函数
Node* insert(Node* node, int data) {
if (node == NULL)
return (Node*)malloc(sizeof(Node));
else if (data < node->data)
node->left = insert(node->left, data);
else if (data > node->data)
node->right = insert(node->right, data);
else // 数据已存在,不做处理
return node;
// 记录当前节点的新高度
node->height = 1 + max(computeHeight(node->left), computeHeight(node->right));
// 检查是否需要旋转
int balance = getBalanceFactor(node);
// 如果左子树太高,需要右旋
if (balance > 1 && data < node->left->data)
return rightRotate(node);
// 如果右子树太高,需要左旋
else if (balance < -1 && data > node->right->data)
return leftRotate(node);
// 或者如果一边太低并且新插入的是不平衡节点,也需要旋转
else if (balance > 1 && data > node->left->data) { // 左旋左孩子的右旋
node->left = leftRotate(node->left);
return rightRotate(node);
} else if (balance < -1 && data < node->right->data) { // 右旋右孩子的左旋
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
// 示例主函数
int main() {
// 初始化树...
Node* root = insert(root, 9);
// 插入更多数据...
return 0;
}
```
请注意,这只是一个基础的实现,并未包含完整的删除和查找功能,以及所有必要的错误检查。实际应用中会更复杂一些,包括处理更多的边界情况和异常。
阅读全文