C++实现红黑树

88 阅读2分钟

红黑树(Red-Black Tree)是一种自平衡的二叉查找树,它通过一系列的规则保持树的平衡,以确保插入、删除和查找等操作的时间复杂度始终保持在 O(log n)。

实现红黑树需要定义节点类和红黑树类,并实现插入、删除和查找等操作。以下是一个简单的红黑树的示例实现:

#include <iostream>

// 红黑树节点类
template<typename K, typename V>
struct RBNode {
    K key;
    V value;
    RBNode* parent;
    RBNode* left;
    RBNode* right;
    bool isRed;

    RBNode(K k, V v) : key(k), value(v), parent(nullptr), left(nullptr), right(nullptr), isRed(true) {}
};

// 红黑树类
template<typename K, typename V>
class RBTree {
private:
    RBNode<K, V>* root;

    // 左旋转
    void leftRotate(RBNode<K, V>* x) {
        RBNode<K, V>* 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(RBNode<K, V>* y) {
        RBNode<K, V>* 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->left) {
            y->parent->left = x;
        } else {
            y->parent->right = x;
        }
        x->right = y;
        y->parent = x;
    }

    // 插入辅助函数
    void insertFixup(RBNode<K, V>* z) {
        while (z->parent != nullptr && z->parent->isRed) {
            if (z->parent == z->parent->parent->left) {
                RBNode<K, V>* y = z->parent->parent->right;
                if (y != nullptr && y->isRed) {
                    z->parent->isRed = false;
                    y->isRed = false;
                    z->parent->parent->isRed = true;
                    z = z->parent->parent;
                } else {
                    if (z == z->parent->right) {
                        z = z->parent;
                        leftRotate(z);
                    }
                    z->parent->isRed = false;
                    z->parent->parent->isRed = true;
                    rightRotate(z->parent->parent);
                }
            } else {
                RBNode<K, V>* y = z->parent->parent->left;
                if (y != nullptr && y->isRed) {
                    z->parent->isRed = false;
                    y->isRed = false;
                    z->parent->parent->isRed = true;
                    z = z->parent->parent;
                } else {
                    if (z == z->parent->left) {
                        z = z->parent;
                        rightRotate(z);
                    }
                    z->parent->isRed = false;
                    z->parent->parent->isRed = true;
                    leftRotate(z->parent->parent);
                }
            }
        }
        root->isRed = false;
    }

    // 插入
    void insert(RBNode<K, V>* z) {
        RBNode<K, V>* y = nullptr;
        RBNode<K, V>* x = root;
        while (x != nullptr) {
            y = x;
            if (z->key < x->key) {
                x = x->left;
            } else {
                x = x->right;
            }
        }
        z->parent = y;
        if (y == nullptr) {
            root = z;
        } else if (z->key < y->key) {
            y->left = z;
        } else {
            y->right = z;
        }
        z->left = nullptr;
        z->right = nullptr;
        z->isRed = true;
        insertFixup(z);
    }

    // 查找辅助函数
    RBNode<K, V>* find(K key) {
        RBNode<K, V>* current = root;
        while (current != nullptr) {
            if (key < current->key) {
                current = current->left;
            } else if (key > current->key) {
                current = current->right;
            } else {
                return current;
            }
        }
        return nullptr;
    }

public:
    RBTree() : root(nullptr) {}

    ~RBTree() {
        // 在这里添加删除树的代码
    }

    // 插入键值对
    void insert(K key, V value) {
        RBNode<K, V>* newNode = new RBNode<K, V>(key, value);
        insert(newNode);
    }

    // 查找键对应的值
    V find(K key) {
        RBNode<K, V>* node = find(key);
        if (node != nullptr) {
            return node->value;
        } else {
            return V(); // 返回默认值
        }
    }

    // 删除键值对
    void erase(K key) {
        // 在这里添加删除键值对的代码
    }
};

int main() {
    // 创建一个红黑树
    RBTree<int, std::string> rbTree;

    // 插入一些键值对
    rbTree.insert(1, "One");
    rbTree.insert(2, "Two");
    rbTree.insert(3, "Three");
    rbTree.insert(4, "Four");
    rbTree.insert(5, "Five");

    // 查找键对应的值并输出
    std::cout << "Value for key 3: " << rbTree.find(3) << std::endl;

    return 0;
}