include <iostream>
enum Color { RED, BLACK };
// 定义红黑树节点结构
struct TreeNode {
int data;
Color color;
TreeNode* parent;
TreeNode* left;
TreeNode* right;
TreeNode(int val) : data(val), color(RED), parent(nullptr), left(nullptr), right(nullptr) {}
};
// 左旋转操作
void leftRotate(TreeNode& root, TreeNode x) {
TreeNode* y = x->right;
x->right = y->left;
if (y->left != nullptr) {
y->left->parent = x;
}
y->parent = x->parent;
if (x->parent == nullptr) {
root = y;
} else if (x == x->parent->left) {
x->parent->left = y;
} else {
x->parent->right = y;
}
y->left = x;
x->parent = y;
}
// 右旋转操作
void rightRotate(TreeNode& root, TreeNode y) {
TreeNode* x = y->left;
y->left = x->right;
if (x->right != nullptr) {
x->right->parent = y;
}
x->parent = y->parent;
if (y->parent == nullptr) {
root = x;
} else if (y == y->parent->right) {
y->parent->right = x;
} else {
y->parent->left = x;
}
x->right = y;
y->parent = x;
}
// 插入节点修正红黑树性质
void insertFixup(TreeNode& root, TreeNode z) {
while (z != root && z->parent->color == RED) {
if (z->parent == z->parent->parent->left) {
TreeNode* y = z->parent->parent->right;
if (y != nullptr && y->color == RED) {
z->parent->color = BLACK;
y->color = BLACK;
z->parent->parent->color = RED;
z = z->parent->parent;
} else {
if (z == z->parent->right) {
z = z->parent;
leftRotate(root, z);
}
z->parent->color = BLACK;
z->parent->parent->color = RED;
rightRotate(root, z->parent->parent);
}
} else {
TreeNode* y = z->parent->parent->left;
if (y != nullptr && y->color == RED) {
z->parent->color = BLACK;
y->color = BLACK;
z->parent->parent->color = RED;
z = z->parent->parent;
} else {
if (z == z->parent->left) {
z = z->parent;
rightRotate(root, z);
}
z->parent->color = BLACK;
z->parent->parent->color = RED;
leftRotate(root, z->parent->parent);
}
}
}
root->color = BLACK;
}
// 在红黑树中插入节点
void insertNode(TreeNode& root, TreeNode z) {
TreeNode* y = nullptr;
TreeNode* x = root;
while (x != nullptr) {
y = x;
if (z->data < x->data) {
x = x->left;
} else {
x = x->right;
}
}
z->parent = y;
if (y == nullptr) {
root = z;
} else if (z->data < y->data) {
y->left = z;
} else {
y->right = z;
}
z->left = nullptr;
z->right = nullptr;
z->color = RED; // 新插入的节点默认为红色
insertFixup(root, z);
}
// 中序遍历打印红黑树节点值
void inorderTraversal(TreeNode* root) {
if (root == nullptr) return;
inorderTraversal(root->left);
std::cout << root->data << " ";
inorderTraversal(root->right);
}
int main() {
TreeNode* root = nullptr;
// 添加节点
insertNode(root, new TreeNode(10));
insertNode(root, new TreeNode(20));
insertNode(root, new TreeNode(30));
insertNode(root, new TreeNode(40));
insertNode(root, new TreeNode(50));
insertNode(root, new TreeNode(25));
std::cout << "Inorder Traversal: ";
inorderTraversal(root);
std::cout << std::endl;
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。