用C语言 写红黑树的算法
以下是使用C语言实现红黑树算法的示例代码:
#include <stdio.h>
#include <stdlib.h>
// 定义红黑树的颜色
typedef enum { RED, BLACK } Color;
// 定义红黑树节点
typedef struct Node {
int data;
struct Node* parent;
struct Node* left;
struct Node* right;
Color color;
} Node;
// 创建红黑树节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->parent = NULL;
newNode->left = NULL;
newNode->right = NULL;
newNode->color = RED;
return newNode;
}
// 左旋操作
void leftRotate(Node** root, Node* node) {
Node* rightChild = node->right;
node->right = rightChild->left;
if (rightChild->left != NULL) {
rightChild->left->parent = node;
}
rightChild->parent = node->parent;
if (node->parent == NULL) {
*root = rightChild;
} else if (node == node->parent->left) {
node->parent->left = rightChild;
} else {
node->parent->right = rightChild;
}
rightChild->left = node;
node->parent = rightChild;
}
// 右旋操作
void rightRotate(Node** root, Node* node) {
Node* leftChild = node->left;
node->left = leftChild->right;
if (leftChild->right != NULL) {
leftChild->right->parent = node;
}
leftChild->parent = node->parent;
if (node->parent == NULL) {
*root = leftChild;
} else if (node == node->parent->left) {
node->parent->left = leftChild;
} else {
node->parent->right = leftChild;
}
leftChild->right = node;
node->parent = leftChild;
}
// 修正红黑树属性
void fixup(Node** root, Node* node) {
while (node != *root && node->parent->color == RED) {
if (node->parent == node->parent->parent->left) {
Node* uncle = node->parent->parent->right;
if (uncle != NULL && 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;
leftRotate(root, node);
}
node->parent->color = BLACK;
node->parent->parent->color = RED;
rightRotate(root, node->parent->parent);
}
} else {
Node* uncle = node->parent->parent->left;
if (uncle != NULL && 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;
rightRotate(root, node);
}
node->parent->color = BLACK;
node->parent->parent->color = RED;
leftRotate(root, node->parent->parent);
}
}
}
(*root)->color = BLACK;
}
// 插入节点
void insert(Node** root, int data) {
Node* newNode = createNode(data);
Node* current = *root;
Node* parent = NULL;
while (current != NULL) {
parent = current;
if (newNode->data < current->data) {
current = current->left;
} else {
current = current->right;
}
}
newNode->parent = parent;
if (parent == NULL) {
*root = newNode;
} else if (newNode->data < parent->data) {
parent->left = newNode;
} else {
parent->right = newNode;
}
fixup(root, newNode);
}
// 前序遍历红黑树
void preorderTraversal(Node* root) {
if (root != NULL) {
printf("%d ", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
int main() {
Node* root = NULL;
// 插入节点示例
insert(&root, 10);
insert(&root, 20);
insert(&root, 30);
insert(&root, 40);
insert(&root, 50);
insert(&root, 60);
insert(&root, 70);
// 前序遍历红黑树
printf("前序遍历结果:");
preorderTraversal(root);
printf("\n");
return 0;
}
以上代码实现了红黑树的插入操作,并提供了前序遍历红黑树的功能。你可以根据实际需求进行修改和扩展
原文地址: http://www.cveoy.top/t/topic/h5hE 著作权归作者所有。请勿转载和采集!