117.info
人生若只如初见

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

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

```cpp

#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), color(Color::RED), parent(nullptr), left(nullptr), right(nullptr) {}

};

template

class RedBlackTree {

private:

Node* root;

void rotateLeft(Node* node) {

Node* 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* node) {

Node* 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* newNode = new Node(data);

Node* parent = nullptr;

Node* 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* node) {

while(node != root && node->parent->color == Color::RED) {

if(node->parent == node->parent->parent->left) {

Node* 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* 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 rbTree;

rbTree.insert(10);

rbTree.insert(20);

rbTree.insert(30);

return 0;

}

```

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

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

推荐文章

  • C++中的依赖注入技术怎么使用

    在C++中,依赖注入通常通过构造函数注入或者通过Setter方法注入来实现。下面是一个简单的示例来演示如何在C++中使用依赖注入技术:
    #include class Service...

  • C++的异步编程模式怎么实现

    在C++中实现异步编程可以使用以下几种方式: 使用线程:可以通过C++的std::thread来创建新的线程,将耗时操作放在新线程中进行,从而实现异步执行。需要注意线程...

  • C++的新特性有哪些

    C++的新特性包括: C++11: 引入了auto关键字、lambda表达式、智能指针、移动语义、右值引用等特性,使得C++更加现代化和易用。 C++14: 对C++11的一些特性进行了改...

  • 如何使用C++进行区块链开发

    要使用C++进行区块链开发,你可以遵循以下步骤: 了解区块链的基本概念:在开始开发之前,你需要对区块链技术有一定的了解,包括区块、链、加密技术、共识算法等...

  • Python中urllib2安装失败的方法是什么

    在Python 3中,`urllib2`模块已经被合并到`urllib`模块中,因此没有单独的安装`urllib2`模块的步骤。您可以使用以下代码导入`urllib`模块:```pythonimport urll...

  • Linux进程的实时调度策略是什么

    Linux进程的实时调度策略包括两种:SCHED_FIFO和SCHED_RR。 SCHED_FIFO(先进先出):SCHED_FIFO是一种实时调度策略,在此策略下,进程会一直运行直到它自愿让出...

  • 使用静态变量跟踪C#应用程序的状态

    在C#中,可以使用静态变量来跟踪应用程序的状态。静态变量是与类关联的变量,它们在整个应用程序范围内保持其值,直到应用程序退出或重新启动。以下是一个简单的...

  • 使用静态变量优化C#中的数据库连接

    在C#中使用静态变量来优化数据库连接可以提高程序的性能和效率。静态变量是在整个应用程序域中共享的变量,可以在不同的类和方法中访问。以下是一个简单的示例代...