c++红黑树实现代码怎么写

以下是一个简单的红黑树实现代码示例:#include enum class Color { RED, BLACK };template class Node {public:T data;Color color;Node* parent;Node* left;Node* right;Node(T data) : data(data

以下是一个简单的红黑树实现代码示例:

#include <iostream>

enum class Color { RED, BLACK };

template <typename T>
class Node {
public:
    T data;
    Color color;
    Node<T>* parent;
    Node<T>* left;
    Node<T>* right;

    Node(T data) : data(data), color(Color::RED), parent(nullptr), left(nullptr), right(nullptr) {}
};

template <typename T>
class RedBlackTree {
private:
    Node<T>* root;

    void rotateLeft(Node<T>* node) {
        Node<T>* temp = node->right;
        node->right = temp->left;

        if(temp->left != nullptr) {
            temp->left->parent = node;
        }

        temp->parent = node->parent;

        if(node->parent == nullptr) {
            root = temp;
        } else if(node == node->parent->left) {
            node->parent->left = temp;
        } else {
            node->parent->right = temp;
        }

        temp->left = node;
        node->parent = temp;
    }

    void rotateRight(Node<T>* node) {
        Node<T>* temp = node->left;
        node->left = temp->right;

        if(temp->right != nullptr) {
            temp->right->parent = node;
        }

        temp->parent = node->parent;

        if(node->parent == nullptr) {
            root = temp;
        } else if(node == node->parent->right) {
            node->parent->right = temp;
        } else {
            node->parent->left = temp;
        }

        temp->right = node;
        node->parent = temp;
    }

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

    void insert(T data) {
        Node<T>* newNode = new Node<T>(data);
        Node<T>* parent = nullptr;
        Node<T>* current = root;

        while(current != nullptr) {
            parent = current;

            if(newNode->data < current->data) {
                current = current->left;
            } else {
                current = current->right;
            }
        }

        newNode->parent = parent;

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

        // Fix the tree
        insertionFixup(newNode);
    }

    void insertionFixup(Node<T>* node) {
        while(node != root && node->parent->color == Color::RED) {
            if(node->parent == node->parent->parent->left) {
                Node<T>* uncle = node->parent->parent->right;

                if(uncle != nullptr && uncle->color == Color::RED) {
                    node->parent->color = Color::BLACK;
                    uncle->color = Color::BLACK;
                    node->parent->parent->color = Color::RED;
                    node = node->parent->parent;
                } else {
                    if(node == node->parent->right) {
                        node = node->parent;
                        rotateLeft(node);
                    }

                    node->parent->color = Color::BLACK;
                    node->parent->parent->color = Color::RED;
                    rotateRight(node->parent->parent);
                }
            } else {
                Node<T>* uncle = node->parent->parent->left;

                if(uncle != nullptr && uncle->color == Color::RED) {
                    node->parent->color = Color::BLACK;
                    uncle->color = Color::BLACK;
                    node->parent->parent->color = Color::RED;
                    node = node->parent->parent;
                } else {
                    if(node == node->parent->left) {
                        node = node->parent;
                        rotateRight(node);
                    }

                    node->parent->color = Color::BLACK;
                    node->parent->parent->color = Color::RED;
                    rotateLeft(node->parent->parent);
                }
            }
        }

        root->color = Color::BLACK;
    }
};

int main() {
    RedBlackTree<int> rbTree;
    rbTree.insert(10);
    rbTree.insert(20);
    rbTree.insert(30);

    return 0;
}

这段代码实现了一个简单的红黑树,并实现了插入节点以及插入后的修复操作。您可以根据需要进行扩展和修改。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/1009671.html

(0)
派派
上一篇 2024-04-28
下一篇 2024-04-28

相关推荐

  • java怎么获取list后面的元素

    要获取List后面的元素,可以使用List的get()方法,结合List的size()方法来获取最后一个元素。以下是一个示例代码:List list = new ArrayList();list.add(“Element 1”);list.add(“Element 2”);list.add(“Element 3”);// 获取最后一个元素String lastElem

    2024-03-05
    0
  • 自己如何建立一个网站(自己怎么建立一个网站)

    自己如何建立一个网站,自己怎么建立一个网站内容导航:如何建立一个自己的网站怎么样建立自己的网站如何建立一个网站呢建立自己的网站一、如何建立一个自己的网站我没记错需要申请网址,还要遵守相关法律,经营一个网站还需要投入很多人力物力,你需要很大一笔本钱,而且现在很多网站都在濒临死亡、有几个能做到b站那么大?所以做网站风险很大的!二、怎么样建立自己的网站要详细点的你想建立一个自己的网站

    2022-05-13
    0
  • 企业内部网站的作用(内部网站制作方法)

    企业的门户网站伴随着信息化时代的发展,人们可以通过网页信息的传播、网上购物等,了解到各行业发展的情况。随着网络快速发展,企业之间的关系日益密切,及时掌握行业发展前沿信息,有助于企业制定相应的发展战略。有关企业动态信息也要及时发布在门户网站上,使外界能

    2021-08-21 技术经验
    0
  • Perl中的持续化存储方法是什么

    在Perl中,持续化存储可以通过使用数据库或文件系统来实现。常见的持续化存储方法包括使用SQLite、MySQL等数据库管理系统来存储数据,也可以使用文本文件、JSON文件等格式来进行持久化存储。另外,Perl还可以使用模块如DBI或DBIx::Class来简化数据库操作。

    2024-04-10
    0
  • 蓝奏云怎么下载别人分享

    很多用户想使用蓝奏云这个软件来下载别人分享的链接,但是不知道怎么样进行下载,其实只要在软件中打开别人分享的链接,点进去就可以下载了。蓝奏云怎么下载别人分享:1、首先找到别人分享的链接。2、然后点进入,进入资源页面。3、接着选择想要下载的文件。4、最后在打开的界面中就可以下载了。

    2024-02-22 技术经验
    0
  • mongodb删除某个字段报错怎么解决

    如果在MongoDB中删除某个字段时出现错误,可能是因为该字段是一个保留字段,或者是因为字段名有特殊字符或空格等问题。以下是一些可能的解决方法:使用$unset操作符来删除字段,示例代码如下:db.collection.update({}, { $unset: { fieldName: “” } }, { multi: true })使用update()方法来更新文档,并将字段设置为null,示例

    2024-04-10
    0

发表回复

登录后才能评论