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;

}


阿白
1 声望0 粉丝