c++

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

小亿
82
2024-04-28 09:31:53
栏目: 编程语言

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

```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;

}

```

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

0
看了该问题的人还看了