我想写一个红黑树用C语言
以下是一个简单的红黑树实现,使用C语言编写:
#include <stdio.h>
#include <stdlib.h>
enum Color { RED, BLACK };
typedef struct Node {
int val;
enum Color color;
struct Node *left;
struct Node *right;
struct Node *parent;
} Node;
Node *root = NULL;
// 创建新节点
Node *newNode(int val) {
Node *node = (Node *)malloc(sizeof(Node));
node->val = val;
node->color = RED;
node->left = node->right = node->parent = NULL;
return node;
}
// 左旋操作
void rotateLeft(Node *node) {
Node *pivot = node->right;
node->right = pivot->left;
if (pivot->left != NULL)
pivot->left->parent = node;
pivot->parent = node->parent;
if (node->parent == NULL)
root = pivot;
else if (node == node->parent->left)
node->parent->left = pivot;
else
node->parent->right = pivot;
pivot->left = node;
node->parent = pivot;
}
// 右旋操作
void rotateRight(Node *node) {
Node *pivot = node->left;
node->left = pivot->right;
if (pivot->right != NULL)
pivot->right->parent = node;
pivot->parent = node->parent;
if (node->parent == NULL)
root = pivot;
else if (node == node->parent->right)
node->parent->right = pivot;
else
node->parent->left = pivot;
pivot->right = node;
node->parent = pivot;
}
// 插入节点
void insert(int val) {
Node *node = newNode(val);
Node *parent = NULL;
Node *curr = root;
while (curr != NULL) {
parent = curr;
if (val < curr->val)
curr = curr->left;
else if (val > curr->val)
curr = curr->right;
else
return;
}
node->parent = parent;
if (parent == NULL)
root = node;
else if (val < parent->val)
parent->left = node;
else
parent->right = node;
while (node != root && node->parent->color == RED) {
if (node->parent == node->parent->parent->left) {
Node *uncle = node->parent->parent->right;
if (uncle && uncle->color == RED) {
node->parent->color = BLACK;
uncle->color = BLACK;
node->parent->parent->color = RED;
node = node->parent->parent;
} else {
if (node == node->parent->right) {
node = node->parent;
rotateLeft(node);
}
node->parent->color = BLACK;
node->parent->parent->color = RED;
rotateRight(node->parent->parent);
}
} else {
Node *uncle = node->parent->parent->left;
if (uncle && uncle->color == RED) {
node->parent->color = BLACK;
uncle->color = BLACK;
node->parent->parent->color = RED;
node = node->parent->parent;
} else {
if (node == node->parent->left) {
node = node->parent;
rotateRight(node);
}
node->parent->color = BLACK;
node->parent->parent->color = RED;
rotateLeft(node->parent->parent);
}
}
}
root->color = BLACK;
}
// 中序遍历
void inorderTraversal(Node *node) {
if (node != NULL) {
inorderTraversal(node->left);
printf("%d ", node->val);
inorderTraversal(node->right);
}
}
int main() {
insert(7);
insert(3);
insert(18);
insert(10);
insert(22);
insert(8);
insert(11);
insert(26);
insert(2);
insert(6);
insert(13);
printf("中序遍历结果:");
inorderTraversal(root);
return 0;
}
输出结果:
中序遍历结果:2 3 6 7 8 10 11 13 18 22 26
原文地址: http://www.cveoy.top/t/topic/bU9g 著作权归作者所有。请勿转载和采集!