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


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

#include <iostream>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;}


上一篇:qt传递参数的方法是什么

下一篇:pycharm怎么刷新项目文件


c++
Copyright © 2002-2019 测速网 www.inhv.cn 皖ICP备2023010105号
测速城市 测速地区 测速街道 网速测试城市 网速测试地区 网速测试街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!

热门搜索 城市网站建设 地区网站制作 街道网页设计 大写数字 热点城市 热点地区 热点街道 热点时间 房贷计算器