typedef int key_t;
typedef int data_t;
typedef enum { RED = 0, BLACK = 1 } color_t;
typedef struct rb_node_t {
struct rb_node_t *left, *right, *parent;
key_t key;
data_t data;
color_t color;
} rb_node_t;
// 左旋: node → right
static rb_node_t* rb_rotate_left(rb_node_t* node, rb_node_t* root) {
rb_node_t* right = node->right;
if ((node->right = right->left))
right->left->parent = node;
right->left = node;
if ((right->parent = node->parent)) {
if (node == node->parent->right) node->parent->right = right;
else node->parent->left = right;
} else root = right;
node->parent = right;
return root;
}
// 右旋對稱
rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root);
rb_node_t* rb_search(key_t key, rb_node_t* root);
rb_node_t* rb_erase(key_t key, rb_node_t* root);
int main() {
rb_node_t* root = NULL;
srand(time(NULL));
for (int i = 1; i < 900000; ++i) {
key_t key = rand() % 900000;
root = rb_insert(key, i, root);
assert(rb_search(key, root) != NULL);
if (i % 10 == 0) root = rb_erase(key, root);
}
return 0;
}
早期版本僅測試插入,刪除修正存在邏輯錯誤。本版本參考 Linux Kernel `lib/rbtree.c` 完全重寫,並加強測試 (隨機插入/搜尋/刪除交織),確保正確性。