用C语言写一个平衡二叉树
时间: 2023-11-25 21:03:08 浏览: 69
下面是用C语言实现的平衡二叉树代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
int height;
struct node *left, *right;
} Node;
// 获取节点高度
int height(Node *n) {
if (n == NULL) return 0;
return n->height;
}
// 获取最大值
int max(int a, int b) {
return (a > b) ? a : b;
}
// 创建节点
Node* newNode(int data) {
Node* node = (Node*) malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right = NULL;
node->height = 1;
return node;
}
// 右旋
Node* rightRotate(Node *y) {
Node *x = y->left;
Node *T2 = x->right;
x->right = y;
y->left = T2;
y->height = max(height(y->left), height(y->right)) + 1;
x->height = max(height(x->left), height(x->right)) + 1;
return x;
}
// 左旋
Node* leftRotate(Node *x) {
Node *y = x->right;
Node *T2 = y->left;
y->left = x;
x->right = T2;
x->height = max(height(x->left), height(x->right)) + 1;
y->height = max(height(y->left), height(y->right)) + 1;
return y;
}
// 获取平衡因子
int getBalance(Node *n) {
if (n == NULL) return 0;
return height(n->left) - height(n->right);
}
// 插入节点
Node* insert(Node* node, int data) {
if (node == NULL) return newNode(data);
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(height(node->left), height(node->right));
int balance = getBalance(node);
// 左左情况
if (balance > 1 && data < node->left->data) {
return rightRotate(node);
}
// 右右情况
if (balance < -1 && data > node->right->data) {
return leftRotate(node);
}
// 左右情况
if (balance > 1 && data > node->left->data) {
node->left = leftRotate(node->left);
return rightRotate(node);
}
// 右左情况
if (balance < -1 && data < node->right->data) {
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
// 中序遍历
void inorder(Node *root) {
if (root != NULL) {
inorder(root->left);
printf("%d ", root->data);
inorder(root->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(root);
printf("\n");
return 0;
}
```
该代码中实现了平衡二叉树的插入操作和中序遍历操作,可以通过插入操作来构建平衡二叉树,并通过中序遍历操作来验证平衡二叉树的正确性。
阅读全文