能写个c++红黑树代码吗
时间: 2023-05-28 19:01:08 浏览: 84
以下是C语言实现的红黑树代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int key;
int color; // 0表示黑色,1表示红色
struct Node *left, *right, *parent;
} Node;
typedef struct {
Node *root;
} RBTree;
// 创建一个节点
Node *new_node(int key, int color) {
Node *p = (Node*) malloc(sizeof(Node));
p->key = key;
p->color = color;
p->left = p->right = p->parent = NULL;
return p;
}
// 左旋
void left_rotate(RBTree *T, Node *x) {
Node *y = x->right;
x->right = y->left;
if (y->left != NULL)
y->left->parent = x;
y->parent = x->parent;
if (x->parent == NULL)
T->root = y;
else if (x == x->parent->left)
x->parent->left = y;
else
x->parent->right = y;
y->left = x;
x->parent = y;
}
// 右旋
void right_rotate(RBTree *T, Node *x) {
Node *y = x->left;
x->left = y->right;
if (y->right != NULL)
y->right->parent = x;
y->parent = x->parent;
if (x->parent == NULL)
T->root = y;
else if (x == x->parent->left)
x->parent->left = y;
else
x->parent->right = y;
y->right = x;
x->parent = y;
}
// 插入一个节点
void rb_insert(RBTree *T, int key) {
Node *z = new_node(key, 1);
Node *y = NULL;
Node *x = T->root;
while (x != NULL) {
y = x;
if (z->key < x->key)
x = x->left;
else
x = x->right;
}
z->parent = y;
if (y == NULL)
T->root = z;
else if (z->key < y->key)
y->left = z;
else
y->right = z;
while (z != T->root && z->parent->color == 1) {
if (z->parent == z->parent->parent->left) {
Node *y = z->parent->parent->right;
if (y != NULL && y->color == 1) {
z->parent->color = 0;
y->color = 0;
z->parent->parent->color = 1;
z = z->parent->parent;
} else {
if (z == z->parent->right) {
z = z->parent;
left_rotate(T, z);
}
z->parent->color = 0;
z->parent->parent->color = 1;
right_rotate(T, z->parent->parent);
}
} else {
Node *y = z->parent->parent->left;
if (y != NULL && y->color == 1) {
z->parent->color = 0;
y->color = 0;
z->parent->parent->color = 1;
z = z->parent->parent;
} else {
if (z == z->parent->left) {
z = z->parent;
right_rotate(T, z);
}
z->parent->color = 0;
z->parent->parent->color = 1;
left_rotate(T, z->parent->parent);
}
}
}
T->root->color = 0;
}
// 中序遍历
void inorder_traversal(Node *x) {
if (x != NULL) {
inorder_traversal(x->left);
printf("%d ", x->key);
inorder_traversal(x->right);
}
}
// 主函数
int main() {
RBTree T;
T.root = NULL;
rb_insert(&T, 10);
rb_insert(&T, 20);
rb_insert(&T, 30);
rb_insert(&T, 100);
rb_insert(&T, 50);
rb_insert(&T, 60);
rb_insert(&T, 70);
inorder_traversal(T.root);
return 0;
}
```
在这个例子中,我们实现了红黑树的插入操作,并对它进行了中序遍历。输出结果为:
```
10 20 30 50 60 70 100
```
这证明了我们成功地将所有节点按照升序排列并插入了红黑树中。
阅读全文
相关推荐












