C++红黑数

以下是一个简单的红黑树的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;
}

复制插入

这个示例定义了一个红黑树类,包含了插入节点、左旋、右旋和红黑树的中序遍历等操作。在示例的主函数中,我们创建了一个红黑树对象,并插入了一些节点,然后打印了红黑树中的节点。

注意:这只是一个简单的红黑树的实现示例,实际上,红黑树是一种复杂的数据结构,需要考虑更多的操作和情况来保持红黑树的平衡和性质。

制作不易,请点赞加关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值