C语言实现手写红黑树



实现手写红黑树是一个相对复杂的任务,需要深入理解数据结构和算法。红黑树是一种自平衡的二叉搜索树,其中每个节点都有一个颜色属性,可以是红色或黑色。它具有以下性质:

  1. 每个节点或者是红色,或者是黑色。
  2. 根节点是黑色。
  3. 每个叶节点(NIL节点,空节点)是黑色。
  4. 如果一个节点是红色的,则它的两个子节点都是黑色。
  5. 对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

下面是一个简单的C语言实现手写红黑树的示例代码:

#include <stdio.h>  
#include <stdlib.h>  
  
#define RED 0  
#define BLACK 1  
  
typedef struct RBTreeNode {  
    int key;  
    int color;  
    struct RBTreeNode *left;  
    struct RBTreeNode *right;  
    struct RBTreeNode *parent;  
} RBTreeNode;  
  
RBTreeNode* createNode(int key, int color, RBTreeNode* parent, RBTreeNode* left, RBTreeNode* right) {  
    RBTreeNode* node = (RBTreeNode*)malloc(sizeof(RBTreeNode));  
    node->key = key;  
    node->color = color;  
    node->parent = parent;  
    node->left = left;  
    node->right = right;  
    return node;  
}  
  
void insertFix(RBTreeNode* node) {  
    while (node->parent != NULL && node->parent->color == RED) {  
        if (node->parent == node->parent->parent->left) {  
            RBTreeNode* 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(node);  
                }  
                node->parent->color = BLACK;  
                node->parent->parent->color = RED;  
                rightRotate(node->parent->parent);  
            }  
        } else {  
            RBTreeNode* 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(node);  
                }  
                node->parent->color = BLACK;  
                node->parent->parent->color = RED;  
                leftRotate(node->parent->parent);  
            }  
        }  
    }  
    root->color = BLACK;  
}  
  
void insert(RBTreeNode** root, int key) {  
    if (*root == NULL) {  
        *root = createNode(key, BLACK, NULL, NULL, NULL);  
        return;  
    } else {  
        RBTreeNode* node = *root;  
        RBTreeNode* parent = NULL;  
        while (node != NULL) {  
            parent = node;  
            if (key < node->key) {  
                node = node->left;  
            } else {  
                node = node->right;  
            }  
        }  
        node = createNode(key, RED, parent, NULL, NULL);  
        insertFix(node);  
    }  
}