以下是一个简单的红黑树的C++实现示例:
#include <iostream>
// 定义红黑树节点的颜色
enum Color { RED, BLACK };
// 红黑树节点结构
struct Node {
int data;
Color color;
Node *left, *right, *parent;
// 构造函数
Node(int data) : data(data) {
parent = left = right = nullptr;
// 默认将新插入的节点设置为红色
color = RED;
}
};
// 红黑树类
class RedBlackTree {
private:
Node *root;
// 对红黑树进行左旋
void rotateLeft(Node *&node) {
Node *new_node = node->right;
node->right = new_node->left;
if (node->right != nullptr) {
node->right->parent = node;
}
new_node->parent = node->parent;
if (node->parent == nullptr) {
root = new_node;
} else if (node == node->parent->left) {
node->parent->left = new_node;
} else {
node->parent->right = new_node;
}
new_node->left = node;
node->parent = new_node;
}
// 对红黑树进行右旋
void rotateRight(Node *&node) {
Node *new_node = node->left;
node->left = new_node->right;
if (node->left != nullptr) {
node->left->parent = node;
}
new_node->parent = node->parent;
if (node->parent == nullptr) {
root = new_node;
} else if (node == node->parent->left) {
node->parent->left = new_node;
} else {
node->parent->right = new_node;
}
new_node->right = node;
node->parent = new_node;
}
// 插入节点后对红黑树进行调整
void fixInsert(Node *&node) {
while (node != root && node->parent->color == RED) {
if (node->parent == node->parent->parent->left) {
Node *uncle = node->parent->parent->right;
if (uncle != nullptr && 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 != nullptr && 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 insert(int data) {
Node *node = new Node(data);
Node *current = root;
Node *parent = nullptr;
while (current != nullptr) {
parent = current;
if (data < current->data) {
current = current->left;
} else {
current = current->right;
}
}
node->parent = parent;
if (parent == nullptr) {
root = node;
} else if (data < parent->data) {
parent->left = node;
} else {
parent->right = node;
}
fixInsert(node);
}
// 中序遍历红黑树
void inOrderTraversal(Node *node) {
if (node == nullptr) {
return;
}
inOrderTraversal(node->left);
std::cout << node->data << " ";
inOrderTraversal(node->right);
}
public:
RedBlackTree() : root(nullptr) {}
// 插入节点的接口函数
void insertNode(int data) {
insert(data);
}
// 打印红黑树
void printTree() {
inOrderTraversal(root);
}
};
int main() {
RedBlackTree tree;
tree.insertNode(10);
tree.insertNode(20);
tree.insertNode(30);
tree.insertNode(40);
tree.insertNode(50);
std::cout << "红黑树中的节点: ";
tree.printTree();
return 0;
}
复制插入
这个示例定义了一个红黑树类,包含了插入节点、左旋、右旋和红黑树的中序遍历等操作。在示例的主函数中,我们创建了一个红黑树对象,并插入了一些节点,然后打印了红黑树中的节点。
注意:这只是一个简单的红黑树的实现示例,实际上,红黑树是一种复杂的数据结构,需要考虑更多的操作和情况来保持红黑树的平衡和性质。
制作不易,请点赞加关注