以下是一个简单的红黑树实现,使用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
我想写一个红黑树用C语言

原文地址: http://www.cveoy.top/t/topic/bU9g 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录