117.info
人生若只如初见

c++红黑树算法怎么实现

红黑树是一种自平衡的二叉查找树,可以在O(log n)的时间复杂度内进行插入、删除和查找操作。以下是一个简单的C++实现红黑树的算法:

#include 
using namespace std;

enum Color { RED, BLACK };

struct Node {
    int data;
    Color color;
    Node *left, *right, *parent;

    Node(int data) : data(data) {
        parent = left = right = NULL;
        color = RED;
    }
};

class RedBlackTree {
private:
    Node *root;

    void rotateLeft(Node *x) {
        Node *y = x->right;
        x->right = y->left;
        if (y->left != NULL) {
            y->left->parent = x;
        }
        y->parent = x->parent;
        if (x->parent == NULL) {
            root = y;
        } else if (x == x->parent->left) {
            x->parent->left = y;
        } else {
            x->parent->right = y;
        }
        y->left = x;
        x->parent = y;
    }

    void rotateRight(Node *x) {
        Node *y = x->left;
        x->left = y->right;
        if (y->right != NULL) {
            y->right->parent = x;
        }
        y->parent = x->parent;
        if (x->parent == NULL) {
            root = y;
        } else if (x == x->parent->left) {
            x->parent->left = y;
        } else {
            x->parent->right = y;
        }
        y->right = x;
        x->parent = y;
    }

    void fixViolation(Node *x) {
        Node *parent = NULL;
        Node *grandparent = NULL;

        while (x != root && x->color == RED && x->parent->color == RED) {
            parent = x->parent;
            grandparent = x->parent->parent;

            if (parent == grandparent->left) {
                Node *uncle = grandparent->right;
                if (uncle != NULL && uncle->color == RED) {
                    grandparent->color = RED;
                    parent->color = BLACK;
                    uncle->color = BLACK;
                    x = grandparent;
                } else {
                    if (x == parent->right) {
                        rotateLeft(parent);
                        x = parent;
                        parent = x->parent;
                    }
                    rotateRight(grandparent);
                    swap(parent->color, grandparent->color);
                    x = parent;
                }
            } else {
                Node *uncle = grandparent->left;
                if (uncle != NULL && uncle->color == RED) {
                    grandparent->color = RED;
                    parent->color = BLACK;
                    uncle->color = BLACK;
                    x = grandparent;
                } else {
                    if (x == parent->left) {
                        rotateRight(parent);
                        x = parent;
                        parent = x->parent;
                    }
                    rotateLeft(grandparent);
                    swap(parent->color, grandparent->color);
                    x = parent;
                }
            }
        }
        root->color = BLACK;
    }

    void insertHelper(Node *node) {
        Node *cur = root;
        Node *parent = NULL;

        while (cur != NULL) {
            parent = cur;
            if (node->data < cur->data) {
                cur = cur->left;
            } else {
                cur = cur->right;
            }
        }

        node->parent = parent;
        if (parent == NULL) {
            root = node;
        } else if (node->data < parent->data) {
            parent->left = node;
        } else {
            parent->right = node;
        }

        fixViolation(node);
    }

    void inorderHelper(Node *node) {
        if (node == NULL) {
            return;
        }

        inorderHelper(node->left);
        cout << node->data << " ";
        inorderHelper(node->right);
    }

public:
    RedBlackTree() : root(NULL) {}

    void insert(int data) {
        Node *node = new Node(data);
        insertHelper(node);
    }

    void inorder() {
        inorderHelper(root);
    }
};

int main() {
    RedBlackTree tree;

    tree.insert(7);
    tree.insert(3);
    tree.insert(18);
    tree.insert(10);
    tree.insert(22);
    tree.insert(8);
    tree.insert(11);
    tree.insert(26);

    cout << "Inorder traversal of the constructed Red-Black tree is: ";
    tree.inorder();

    return 0;
}

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe8b1AzsIBwJSAVU.html

推荐文章

  • c#多线程异步执行怎么实现

    在C#中实现多线程异步执行可以使用Task类或者Thread类。 使用Task类: using System;
    using System.Threading.Tasks; class Program
    { static void Ma...

  • c#中怎么使用random生成随机数

    在C#中,可以使用Random类来生成随机数。以下是一个简单的示例:
    using System; class Program
    { static void Main() { Random random = new Random()...

  • c#中random的应用场景有哪些

    生成随机数:Random类可以用来生成随机整数、双精度浮点数、布尔值等。 随机排序:可以使用Random类来对数组或集合中的元素进行随机排序。 随机选择:可以使用Ra...

  • c#中cache使用要注意哪些事项

    在使用缓存时,以下事项需要注意: 内存消耗:缓存数据会占用系统内存,因此需要根据系统的内存情况和缓存数据量来合理设置缓存大小。 缓存失效:缓存中的数据可...

  • debian怎么配置有线网络

    要在Debian中配置有线网络连接,可以按照以下步骤操作: 打开终端,输入以下命令来编辑网络配置文件: sudo nano /etc/network/interfaces 在文件中添加以下内容...

  • linux怎么编译安装网卡驱动

    编译安装网卡驱动在Linux系统中通常需要遵循以下步骤: 下载并解压驱动源代码:
    首先,从网卡厂商的官方网站或其他可信来源下载适用于你的网卡型号的驱动源...

  • linux如何安装无线网卡驱动

    在 Linux 中安装无线网卡驱动通常需要使用以下步骤: 确定无线网卡型号:首先需要确定你的无线网卡型号,可以通过命令 lspci 或者 lsusb 查看系统中的硬件设备信...

  • linux怎么查看无线网卡信息

    要查看Linux系统中的无线网卡信息,可以使用以下命令: 使用iwconfig命令查看无线网卡的配置信息,包括网络名称、频率、信号强度等。示例命令如下: iwconfig 使...